2016-09-16 8 views
0

まず、私はこれらのような質問については言いません(12)。私は既にコンストラクタを持っているクラスについて話していますが、それが意味をなさないならば、定義によってではなく、値によって入れ子になっています。入れ子クラスのコンストラクタを呼び出す方法

現在、私が働くこの方法を、持っているが、newを使用し、IMO醜いです:Bのコンストラクタを

class A { 
private: 
    int value; 

public: 
    A(int _value); 
}; 

class B { 
private: 
    A *a; 
public: 
    B(int _value); 
}; 

B::B(int _value) 
{ 
    a = new A(_value); 
} 

私はA aA *a;を変更した場合、 Aのコンストラクタが同じ方法で呼び出されるように、Bを作成するにはどうすればよいですか?

私が試してみた:Aためのいくつかの明示的なvoid A::init(_value)(必要になり、追加のコンストラクタを使用してnew

  • でポインタを使用して

    • :それはなしで可能ていないよう

      B::B(int _value) 
      { 
          a = A(_value); // no matching function for call to ‘A::A()’ 
          a = A::A(_value); // cannot call constructor ‘A::A’ directly 
          a(_value);  // no match for call to ‘(A) (int&)’ 
          a.A(_value);  // invalid use of `A::A` 
      } 
      

      引数を取らないようにする)

    • クラスAを拡張する(特定のprivateメンバーをprotectedとw )不要なやり方でmemcpy()A temp(_value); memcpy(&a, &temp, sizeof (A));

  • 疑わしい使用を彼らの「名前空間」をメッシュウルドは、上記の方法に頼ることなく、このことは可能ですか?

  • +0

    参照メンバとコンストラクタ初期化子リストを使用します。 –

    +0

    この場合、参照が値に対して持つ利点はありますか?両方とも 'B 'の作成時に作成されるようで、両方とも同じ使用構文と意味を持ちます。 –

    +0

    いいえ、おそらくちょうどあなたの質問が間違っています。 –

    答えて

    1

    初期化リストを使用します。

    I.e. Bコンストラクタは次のようになります

    class B { 
        ... 
    
        A a; 
    }; 
    
    B::B(int _value) : a(_value) { 
        ... 
    } 
    
    +0

    'a'は実際にはポインタです! –

    +1

    @πάνταῥεOP OPはまさにOPが取り除こうとしているものです。 –

    +0

    @πάνταῥεῖ - 彼はポインタからそれを変更したいと言っています。 –

    関連する問題