Вызов конструктора C ++ - нужна помощь, чтобы понять, как выполняются определенные вызовы - PullRequest
0 голосов
/ 05 декабря 2010
class PayOffBridge
{
public:

    PayOffBridge();
    PayOffBridge(const PayOffBridge& original);
    PayOffBridge(const PayOff& innerPayOff);

    inline double operator()(double Spot) const;
    ~PayOffBridge();
    PayOffBridge& operator=(const PayOffBridge& original);

private:

    PayOff* ThePayOffPtr;

};

и другой класс с членом, который является объектом class PayOffBridge:

class VanillaOption
{
public:

    VanillaOption(const PayOffBridge& ThePayOff_, double Expiry);

    double OptionPayOff(double Spot) const;
    double GetExpiry() const;

private:

    double Expiry;
    PayOffBridge ThePayOff;
};

PayOff* ThePayOffPtr в PayOffBridge является указателем на следующий чистый виртуальный абстрактный класс:

class PayOff
{
public:

    PayOff(){};

    virtual double operator()(double Spot) const=0;
    virtual ~PayOff(){}
    virtual PayOff* clone() const=0;

private:

};

Класс бетона PayOffCall является производным от PayOff. В main() у меня

PayOffCall thePayOff(Strike);//double Strike
VanillaOption theOption(thePayOff, Expiry);//double Expiry

Когда я выполняю код с помощью F11 в Visual Studio, строка VanillaOption theOption(thePayOff, Expiry); в итоге вызывает PayOffBridge(const PayOff& innerPayOff);. Я не могу понять, откуда это называется. Как конструктор для VanillaOption в итоге вызывает это?

Мой второй вопрос - конструктор для VanillaOption, который вызывается из main():

VanillaOption::VanillaOption(const PayOffBridge& ThePayOff_, double Expiry_): ThePayOff(ThePayOff_), Expiry(Expiry_)
{
}

Что именно делает ThePayOff(ThePayOff_)? То есть, какой конструктор PayOffBridge вызывается, если вообще, и что именно выполняет этот синтаксис?

Ответы [ 2 ]

2 голосов
/ 05 декабря 2010

1-й ответ

VanillaOption ожидает PayOffBridge объект в качестве параметра конструктора. Но вместо этого вы передаете объект PayOffCall. Компилятор ищет способ создания временного PayOffBridge объекта из данного PayOffCall объекта.

Имеет конструктор PayOffBridge(const PayOff& innerPayOff);. Таким образом, для строительства требуется ссылка на PayOff объект. Но PayOffCall является производным от PayOff, поэтому const PayOffCall& неявно преобразуется в const PayOff&, и вы получите PayOffBridge построенный.

2-й ответ

ThePayOff(ThePayOff_) означает строительство объекта. Для начала вы должны распознать типы этих переменных.

const PayOffBridge& ThePayOff_ - входной параметр

PayOffBridge ThePayOff - член VanilaOption

Итак, PayOffBridge объект построен из другого PayOffBridge объекта. Очевидно, конструктор копирования называется

PayOffBridge(const PayOffBridge& original);

1 голос
/ 05 декабря 2010

Используемый вами конструктор для VanillaOption имеет список инициализации для создания своих внутренних членов.Это вызывает конструктор copy для PayoffBridge, копируя ThePayoff_ в ThePayoff

VanillaOption::VanillaOption(const PayOffBridge& ThePayOff_, double Expiry_):
    ThePayOff(ThePayOff_), 
    Expiry(Expiry_)
{
}

«Тело» этого конструктора намеренно пусто, поскольку вся работа выполненапо списку инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...