2010-12-04 3 views
0
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; 

}; 

et une autre classe avec un membre qui est un objet de class PayOffBridge:C de l'appel constructeur - besoin de l'aide comprendre comment certains appels sont effectués

class VanillaOption 
{ 
public: 

    VanillaOption(const PayOffBridge& ThePayOff_, double Expiry); 

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

private: 

    double Expiry; 
    PayOffBridge ThePayOff; 
}; 

Le PayOff* ThePayOffPtr dans PayOffBridge est un pointeur vers le virtuel pur suivant classe abstraite:

class PayOff 
{ 
public: 

    PayOff(){}; 

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

private: 

}; 

La classe béton PayOffCall est dérivé de PayOff. En main() je

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

Lorsque je fais un pas par le code à l'aide F11 dans Visual Studio, la ligne VanillaOption theOption(thePayOff, Expiry); finit par appeler PayOffBridge(const PayOff& innerPayOff);. Je ne peux pas comprendre d'où cela s'appelle. Comment le constructeur de VanillaOption finit par appeler cela?

Ma 2ème question est le constructeur de VanillaOption qui est appelé à partir main() est

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

Qu'est-ThePayOff(ThePayOff_) exactement? C'est-à-dire, quel constructeur de PayOffBridge est appelé, le cas échéant, et que fait exactement cette syntaxe?

Répondre

2

1ère réponse

VanillaOption objet PayOffBridge attend en tant que paramètre constructeur. Mais, vous passez l'objet PayOffCall à la place. Le compilateur cherche un moyen de construire l'objet PayOffBridge temporaire à partir de l'objet PayOffCall donné. Il a PayOffBridge(const PayOff& innerPayOff); constructeur. Donc, il a besoin d'une référence à PayOff objet pour la construction. Mais, PayOffCall est dérivé de PayOff, donc const PayOffCall& est implicitement converti en const PayOff& et vous obtenez PayOffBridge construit.

2ème réponse

ThePayOff(ThePayOff_) signifie la construction d'objets. Pour commencer, vous devriez reconnaître les types de ces variables.

const PayOffBridge& ThePayOff_ - paramètre d'entrée

PayOffBridge ThePayOff - Membre de VanilaOption

Ainsi, un objet PayOffBridge est construit à partir un autre objet PayOffBridge. De toute évidence, constructeur de copie est appelé

PayOffBridge(const PayOffBridge& original);

+0

Wow ... Je suppose que c'est alors ... le compilateur descend la liste des constructeurs possibles pour 'PayOffBridge' qui pourrait utiliser l'objet' PayOffCall' ... Celui que j'ai rencontré est le plus proche ... ouvre une autre série de questions ... que se passe-t-il quand il y a égalité pour le «plus proche»? – Tryer

+0

Merci pour la clarification ... cela rend mon précédent commentaire discutable. – Tryer

+0

@Tryer C++ a des règles strictes dont le constructeur surchargé ou la méthode devrait être appelée. S'il y a deux constructeurs ou plus, vous obtenez une erreur de compilation. – Stas

1

Le constructeur pour VanillaOption que vous utilisez a un initialization list pour construire ses membres internes. Ceci est le constructeur invoquait copie pour PayoffBridge, la copie ThePayoff_ dans ThePayoff

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

Le « corps » de ce constructeur est intentionnellement vide parce que tout le travail est effectué par la liste d'initialisation.

+0

Hmm ... mais 'PayOffBridge (const PayOff & innerPayOff)' est pas un constructeur de copie, non? Il s'applique à un objet 'PayOffBridge' mais son paramètre est un objet' PayOff'. – Tryer

+0

Oups. Oui, je vais corriger cela. Mais ça ne fait pas vraiment de différence. L'héritage de Rember est sur "est un", donc votre PayoffCall 'est un "PayOff", de sorte que le constructeur peut être utilisé sans ambiguïté. – Roddy

Questions connexes