2016-07-18 132 views
0

編譯下面的代碼我在105行得到這個error C2512: 'PayOffBridge': no appropriate default constructor available沒有適當的默認構造函數可用 - 默認構造函數調用的地方在哪裏?

我的問題是:默認的構造函數被調用?我該如何解決它?

注:這裏大部分提供的代碼是由馬克·喬希 - 設計模式及衍生證券定價

#include <iostream> 
#include <boost/random/mersenne_twister.hpp> 
#include <boost/random/normal_distribution.hpp> 
#include <boost/random/variate_generator.hpp> 
#include <cmath> 
#include <boost/shared_ptr.hpp> 
#include <stdio.h> 
#include <vector> 

// ********************* PayOff3 

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

    private: 
}; 


class PayOffCall : public PayOff{ 
    public: 
     PayOffCall(double Strike_); 
     virtual double operator()(double Spot) const ; 
     virtual ~PayOffCall(){} 
     virtual PayOff* clone() const ; 
    private: 
     double Strike; 
}; 

PayOffCall::PayOffCall(double Strike_) : Strike(Strike_) { 

} 

double PayOffCall::operator()(double Spot) const { 
    return std::max(Spot - Strike, 0.0); 
} 

PayOff* PayOffCall::clone() const { 
    return new PayOffCall(*this); 
} 

// ********************* PayOff Bridge 

class PayOffBridge { 
    public : 
     PayOffBridge(const PayOffBridge& original); 
     PayOffBridge(const PayOff& innerPayOff); 
     PayOffBridge& operator = (const PayOffBridge& original); 
     ~PayOffBridge(); 

     inline double operator()(double Spot) const; 

    private: 
     PayOff* ThePayOffPtr; 
}; 

inline double PayOffBridge::operator() (double Spot) const { 
    return ThePayOffPtr->operator()(Spot); 
} 

PayOffBridge::PayOffBridge(const PayOffBridge& original){ 
    ThePayOffPtr = original.ThePayOffPtr->clone(); 
} 

PayOffBridge::PayOffBridge(const PayOff& innerPayOff){ 
    ThePayOffPtr = innerPayOff.clone(); 
} 

PayOffBridge& PayOffBridge::operator = (const PayOffBridge& original){ 
    if (this != &original){ 
     delete ThePayOffPtr; 
     ThePayOffPtr = original.ThePayOffPtr->clone(); 
    } 
    return *this; 
} 

PayOffBridge::~PayOffBridge(){ 
    delete ThePayOffPtr; 
} 

// ********************* Vanilla2 

class VanillaOption { 

    public: 
     VanillaOption(const PayOffBridge& thePayOff, double expiry); 
     VanillaOption(const VanillaOption& original); 
     VanillaOption& operator() (const VanillaOption& original); 
     ~VanillaOption(); 

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

    private: 
     double Expiry; 
     PayOffBridge ThePayOffBridge; 
}; 

VanillaOption::VanillaOption(const PayOffBridge& thePayOff, double expiry) : Expiry(expiry), ThePayOffBridge(thePayOff){ 
} 

VanillaOption::VanillaOption(const VanillaOption& original){ 
    Expiry=original.GetExpiry(); 
    ThePayOffBridge = original.ThePayOffBridge; 
} 


double VanillaOption::GetExpiry() const { 
    return Expiry; 
} 
double VanillaOption::OptionPayOff(double Spot) const { 
    return ThePayOffBridge(Spot); 
} 

VanillaOption& VanillaOption::operator() (const VanillaOption& original){ 
    if (this != &original){ 
     Expiry=original.GetExpiry(); 
     ThePayOffBridge = original.ThePayOffBridge; 
    } 
    return *this; 
} 

VanillaOption::~VanillaOption(){ 
} 



int main(){ 

} 
+1

在'VanillaOption'的拷貝構造函數,你不使用構造函數的初始化列表,因此具有默認構造VanillaOption'的'所有成員。在這種情況下,就像參數化構造函數 – KABoissonneault

回答

4

VanillaOption(const VanillaOption& original)沒有初始化列表,這意味着成員必須是缺省構造。讓它

VanillaOption::VanillaOption(const VanillaOption& original) 
    : Expiry(original.GetExpiry()), 
    ThePayOffBridge(original.ThePayOffBridge) 
{} 
+1

或簡單的'VanillaOption :: VanillaOption(const VanillaOption&)= default;'一樣。 – Jarod42

+0

爲什麼這樣做與初始化列表不同?我怎麼知道我必須使用初始化列表而不是在複製構造函數中編寫代碼? –

+1

您的原始代碼嘗試默認構建這兩個成員,然後分配給它們。複製構造和複製賦值是兩件不同的事情:'int x = 42;'與'int x'不完全相同; x = 42;'關於你怎麼知道 - 就像你學習任何其他語言功能一樣,我想:從你的教科書,你的教師,你的在線教程,或從StackOverflow詢問。 –