2015-03-04 2 views
0

Я запускаю модель ценообразования опционов, которая дает четыре значения для четырех различных параметров.Проблемы с перегрузкой функций 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:

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 также совпадает с выводом 1 (это неверно). Я был бы благодарен за руководство, которое у вас может быть.

+4

Конструкторы имеют точно такой же * тип параметра *. Имя параметров не имеет значения. Как вы можете решить эти два метода во время выполнения? – juanchopanza

ответ

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{}}; 
+0

Спасибо, я внедрил ваши изменения.Но для «варианта EuroOption1 {Batch1 {}}; Я получаю сообщение об ошибке «ожидаемый»}, чтобы соответствовать этому «{». Я что-то упустил? – kits

+0

Какой компилятор вы используете? Этот синтаксис потребует достаточно современного. – tahsmith

+0

Я использую Clang – kits

4

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

EuroOption::EuroOption(vector<double> Batch1) 

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

Для, например, эти перегруженные функции,

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

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

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

Эти заявления эквивалентны:

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

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

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

для будущей ссылки проверки: http://www.cplusplus.com/doc/tutorial/functions2/

+1

Обратите внимание, что для функции без шаблона возвращаемый тип не является частью подписи. – juanchopanza

0

Метод Перегрузка означает тот же самый метод различных подписи EuroOption (вектор BATCH1); EuroOption (вектор Batch2); тот же метод объявил два раза в том же классе, что и метод ошибки. Redeclaration

Смежные вопросы