没有适当的默认构造函数可用 - 默认构造函数调用的地方在哪里?

问题描述:

编译下面的代码我在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

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询问。 –