函数重载问题C++

Function overloading problems C++

我是 运行 一个期权定价模型,可以为四种不同的期权产生四种价值。

class EuroOption
{
private:
    double S;    //underlying stock price
    double X;    //strike price
    double sigma;    //volatility
    double T;    //time to expiration
    double r;    //risk-free rate
    double b;    //cost of carry
public:
    EuroOption();    //default constructor
    ~EuroOption();    //destructor
    EuroOption(const EuroOption& eo);    //copy constructor
    EuroOption& operator = (const EuroOption& source);    //assignment operator
    EuroOption(vector<double> Batch1);
    EuroOption(vector<double> Batch2);  //this is the error: redeclaration
    //EuroOption(vector<double> const Batch3);
    //EuroOption(vector<double> const Batch4);

这是来自 .cpp 的源 material:

EuroOption::EuroOption(vector<double> Batch1) : S(60), X(65), sigma(0.30), r(0.08), T(0.25), b(r)
{
}

EuroOption::EuroOption(vector<double> Batch2) : S(100), X(100), sigma(0.20), r(0), T(1), b(r)
{
}

我遇到的错误是 "constructor cannot be redeclared"。但是我的函数有不同的参数(Batch1/Batch2)所以我不明白为什么它没有重载。 Batch2 的输出也与 Batch 1 相同(这是不正确的)。如果您能提供指导,我将不胜感激。

重载基于参数类型而不是参数名称。

EuroOption::EuroOption(vector<double> Batch1)  

这里vector<double>是参数类型,Batch1是参数名称
如果要重载函数,则应声明具有不同参数类型或不同数量参数的函数。

例如,这些是重载函数,

EuroOption::EuroOption(vector<double> Batch1)
EuroOption::EuroOption(vector<int> Batch1)
EuroOption::EuroOption(string Batch1)

这些构造函数是相同的:

EuroOption(vector<double> Batch1);
EuroOption(vector<double> Batch2); 

这些声明等同于:

EuroOption(vector<double>);
EuroOption(vector<double>); 

因为函数签名相同。这由参数的 return 类型、名称和数量以及类型决定。

虽然参数名称不同,但函数的签名完全相同。在您的示例中,当您调用构造函数时,您如何决定调用哪个构造函数?唯一的区别是参数名称,但调用者无法访问它。

供将来参考检查:http://www.cplusplus.com/doc/tutorial/functions2/

方法重载意味着相同的方法不同的签名 EuroOption(向量 Batch1); EuroOption(向量 Batch2); 同一个方法在同一个 class 中声明了两次导致错误方法重新声明

我猜你想要做的是标记分派构造函数或类似的东西,以便使用不同的硬编码默认值构造 EuroOption。

struct Batch1{};
struct Batch2{};

class EuroOption
{
private:
    double S;    //underlying stock price
    double X;    //strike price
    double sigma;    //volatility
    double T;    //time to expiration
    double r;    //risk-free rate
    double b;    //cost of carry
public:
    EuroOption();    //default constructor
    ~EuroOption();    //destructor
    EuroOption(const EuroOption& eo);    //copy constructor
    EuroOption& operator = (const EuroOption& source);    //assignment operator
    EuroOption(Batch1);
    EuroOption(Batch2);

.cpp 文件:

EuroOption::EuroOption(Batch1) : S(60), X(65), sigma(0.30), r(0.08), T(0.25), b(r)
{
}

EuroOption::EuroOption(Batch2) : S(100), X(100), sigma(0.20), r(0), T(1), b(r)
{
}

然后在您的代码中的其他地方,它可以构造为:

EuroOption option1{Batch1{}};
EuroOption option2{Batch2{}};