2016-08-02 15 views
5

Ich muss den Konstruktoraufruf verzögern, damit ich den Wert initialisieren kann, der an den Konstruktor übergeben werden soll. Ich habe ein kurzes und sehr vereinfachtes Beispiel geschrieben.Verzögerung Konstruktor Aufruf

class A 
{ 
private: 
    ObjectA* _ptr; 

public: 
    A(ObjectA*); 
}; 

class B 
{ 
private: 
    A object;  // The constructor seems to be called here? 
    ObjectA* obj; 

public: 
    B(); 
}; 

A::A(ObjectA* ptr) 
{ 
    this->_ptr = ptr; 
} 

B::B() 
{ 
    obj = new ObjectA(); 
    object(obj); // I want to call the 'A' constructor here, after initializing of 'obj'. 
} 

Ist es möglich?

+0

Erstellen Sie 'A' dynamisch im' B'-Konstruktor und speichern Sie den Zeiger darauf. – Ari0nhh

+3

Verwenden Sie für C++ 17 ['std :: optional'] (http://en.cppreference.com/w/cpp/utility/optional). Oder verbessern Sie einfach Ihr Design. – StoryTeller

+0

Warum können Sie das Erstellen des Objekts nicht einfach aufschieben, bis der Wert, der zum Erstellen des Objekts verwendet werden soll, initialisiert wird? Es ist nicht so, dass es oft sinnvoll ist, ein Objekt zu erstellen und es dann zu verwenden, bevor es richtig initialisiert wurde. – Peter

Antwort

15

Nein, Sie können eine Konstruktion eines Wertelements nicht verschieben. Sie können einen Zeiger anstelle eines direkten Werts verwenden, aber das ist keine Lösung für Ihr Problem.

Die richtige Lösung für Ihr Problem initialization list verwendet:

B::B () : obj(new ObjectA), object(obj) {} 

Außerdem haben Sie obj vor object in class B setzen: für diese

class B 
{ 
     private: 
       ObjectA *obj; 
       A  object; 

     public: 
       B (); 
} 

Der Grund dafür ist, dass, wenn ein Konstruktor heißt, müssen alle Objekte Mitglieder ordnungsgemäß erstellt und initialisiert werden. Dies geschieht mit ihrem Standardkonstruktor.

Der Grund für die Neuordnung der Klassenmitglieder ist, dass die Initialisierer der Mitglieder in der Reihenfolge aufgerufen werden, in der sie in der Klasse deklariert sind, nicht in der Reihenfolge ihres Auftretens in der Initialisierungsliste.

+1

Ich würde dringend empfehlen das OP verwendet 'std :: unique_ptr'. Auf diese Weise muss er sich nicht darum kümmern, die Erinnerung zu verwalten. –

+1

@MartinBonner, für 'obj' natürlich, es ist ein anderes Thema. –

Verwandte Themen