2016-08-02 93 views
5

我需要延遲構造函數調用,所以我可以初始化應該傳遞給構造函數的值。我寫了一個簡短而簡單的例子。延遲構造函數調用

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'. 
} 

這可能嗎?

+0

在'B'構造函數中動態創建'A'並存儲指向它的指針。 – Ari0nhh

+3

對於C++ 17,使用['std :: optional'](http://en.cppreference.com/w/cpp/utility/optional)。或者只是改善你的設計。 – StoryTeller

+0

爲什麼你不能推遲創建對象,直到用來構造它的值被初始化?這並不是說創建一個對象然後在它被正確初始化之前使用它通常是明智的。 – Peter

回答

15

不,你不能推遲一個價值成員的建設。您可以使用指針而不是直接值,但這對您的問題無效。

有關問題的妥善解決方案是使用initialization list

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

而且,你必須把objobjectclass B

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

     public: 
       B (); 
} 

這樣做的原因是,當一個構造函數被調用時,所有的對象成員都必須正確構造和初始化。這是使用它們的默認構造函數完成的。

重新排序類成員的原因是成員的初始值設定項按照它們在類中聲明的順序調用,而不是按照其在初始化列表中出現的順序調用。

+1

我強烈建議OP使用'std :: unique_ptr'。這樣他不需要擔心管理內存。 –

+1

@MartinBonner,當然,對於'obj',buf是一個不同的話題。 –