函数重载问题C ++

时间:2015-03-04 06:49:06

标签: c++ vector overloading

我正在运行期权定价模型,为四种不同的选项产生四个值。

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的源材料:

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)
{
}

我得到的错误是“构造函数无法重新声明”。但我的函数有不同的参数(Batch1 / Batch2),所以我不明白它为什么不重载。 Batch2的输出也与Batch 1相同(这不正确)。我很感激你的指导。

5 个答案:

答案 0 :(得分:4)

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

EuroOption::EuroOption(vector<double> Batch1)  

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

例如,这些是重载函数,

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

答案 1 :(得分:3)

我猜你想做的事情的意图是标记调度构造函数或类似的东西,以便使用不同的硬编码默认值构造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{}};

答案 2 :(得分:1)

这些构造函数是相同的:

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

这些声明等同于:

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

答案 3 :(得分:0)

这是因为功能签名是相同的。这取决于返回类型,名称和数量以及参数的类型。

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

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

答案 4 :(得分:0)

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