2016-07-18 18 views
0

Kompilieren Sie den Code unten bekomme ich dies bei Zeile 105 error C2512: 'PayOffBridge': no appropriate default constructor availableKein geeigneter Standardkonstruktor verfügbar - Wo wurde der Standardkonstruktor aufgerufen?

Meine Frage ist: Wo wird der Standardkonstruktor aufgerufen? Und wie kann ich es reparieren?

NB: Die meisten der Code hier vorgesehen ist von Mark Joshi - Design Patterns and Derivatives

Preis
#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

In 'VanillaOption' Kopie Konstruktor, Sie verwenden nicht die Initialisiererliste Konstruktor, deshalb hat es auf die Standard alle Mitglieder' VanillaOption' konstruieren. Mach einfach den parametrisierten Konstruktor – KABoissonneault

Antwort

4

VanillaOption(const VanillaOption& original) nicht die Initialisiererliste hat, was bedeutet, Mitglieder default-konstruiert sein müssen. Machen Sie es

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

oder einfach 'VanillaOption :: VanillaOption (const VanillaOption &) = default;' in diesem Fall. – Jarod42

+0

Warum unterscheidet sich dies von der Initialisierungsliste? Wie kann ich wissen, dass ich die Initialisierungsliste verwenden muss, anstatt Code innerhalb des Kopierkonstruktors zu schreiben? –

+1

Ihr ursprünglicher Code versucht, die beiden Elemente standardmäßig zu konstruieren und ihnen dann zuzuweisen. Copy-Konstruktion und Copy-Assignment sind zwei verschiedene Dinge: 'int x = 42;' ist nicht ganz dasselbe wie 'int x; x = 42; 'So wie du es wissen könntest - genauso wie du andere Sprachfunktionen lernst, nehme ich an: von deinem Lehrbuch, deinem Lehrer, deinem Online-Tutorial oder von der Frage nach StackOverflow. –