2016-08-02 6 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) {} 

また、あなたがclass Bobjectobjを配置する必要があります:

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

     public: 
       B (); 
} 

この理由は、そのときコンストラクタですすべてのオブジェクトメンバを適切に構築して初期化する必要があります。これはデフォルトコンストラクタを使用して行われます。

クラスメンバを並べ替える理由は、メンバの初期化子が、初期化リストのApp Appearanceの順序ではなく、クラスで宣言された順番で呼び出されるためです。

+1

OPは 'std :: unique_ptr'を使うことを強くお勧めします。そうすれば、彼はメモリの管理について心配する必要はありません。 –

+1

@MartinBonner、それは別のトピックだbufは、当然のobj' 'ため。 –

関連する問題