Я использую модель ценообразования опционов, которая дает четыре значения для четырех различных опций.

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), поэтому я не понимаю, почему они не перегружаются. Выходные данные для пакета 2 также такие же, как для пакета 1 (это неверно). Я был бы признателен за ваше руководство.

0
kits 4 Мар 2015 в 09:49

5 ответов

Лучший ответ

Я предполагаю, что цель того, что вы хотите сделать, состоит в том, чтобы пометить отправку конструктора или что-то подобное, чтобы 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{}};
3
tahsmith 4 Мар 2015 в 07:13

Перегрузка метода означает один и тот же метод с разными сигнатурами EuroOption (вектор Batch1); EuroOption (вектор Batch2); один и тот же метод был объявлен дважды в одном и том же классе вызывает повторное объявление метода ошибки

0
Captain Price 4 Мар 2015 в 07:07

Это потому, что сигнатура функции такая же. Это определяется типом возвращаемого значения, именем, числом и типом аргументов.

Хотя имя параметра отличается, функции имеют одинаковую сигнатуру. В вашем примере, когда вы вызываете конструктор, как вы решаете, какой конструктор вызывается? Единственное отличие - это имя параметра, но оно недоступно для вызывающего.

Для будущей справочной проверки: http://www.cplusplus.com/doc/tutorial/functions2/ < / а>

0
Topo 4 Мар 2015 в 06:55

Эти конструкторы такие же:

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

Эти объявления эквивалентны:

EuroOption(vector<double>);
EuroOption(vector<double>); 
1
Marcin 4 Мар 2015 в 06:53

Перегрузка основана на типах параметров, а не на именах параметров.

EuroOption::EuroOption(vector<double> Batch1)  

Здесь vector<double> - это тип параметра, а Batch1 - имя параметра.
Если вам нужны функции перегрузки, вы должны объявить функции с разными типами параметров или другим количеством параметров.

Например, это перегруженные функции,

EuroOption::EuroOption(vector<double> Batch1)
EuroOption::EuroOption(vector<int> Batch1)
EuroOption::EuroOption(string Batch1)
4
cppcoder 4 Мар 2015 в 06:57