Я использую модель ценообразования опционов, которая дает четыре значения для четырех различных опций.
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 (это неверно). Я был бы признателен за ваше руководство.
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{}};
Перегрузка метода означает один и тот же метод с разными сигнатурами EuroOption (вектор Batch1); EuroOption (вектор Batch2); один и тот же метод был объявлен дважды в одном и том же классе вызывает повторное объявление метода ошибки
Это потому, что сигнатура функции такая же. Это определяется типом возвращаемого значения, именем, числом и типом аргументов.
Хотя имя параметра отличается, функции имеют одинаковую сигнатуру. В вашем примере, когда вы вызываете конструктор, как вы решаете, какой конструктор вызывается? Единственное отличие - это имя параметра, но оно недоступно для вызывающего.
Для будущей справочной проверки: http://www.cplusplus.com/doc/tutorial/functions2/ < / а>
Эти конструкторы такие же:
EuroOption(vector<double> Batch1);
EuroOption(vector<double> Batch2);
Эти объявления эквивалентны:
EuroOption(vector<double>);
EuroOption(vector<double>);
Перегрузка основана на типах параметров, а не на именах параметров.
EuroOption::EuroOption(vector<double> Batch1)
Здесь vector<double>
- это тип параметра, а Batch1
- имя параметра.
Если вам нужны функции перегрузки, вы должны объявить функции с разными типами параметров или другим количеством параметров.
Например, это перегруженные функции,
EuroOption::EuroOption(vector<double> Batch1)
EuroOption::EuroOption(vector<int> Batch1)
EuroOption::EuroOption(string Batch1)
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .