2011-10-29 11 views
0

私はクラスAとB Bを持っているが、私はA.このクラスの他のメンバーデータでクラスメンバーデータを初期化するにはどうすればよいですか?

class A; 
class B 
{ 
public: 
    B(A& a){cout << "B constr is run \n";} 
}; 

class A 
{ 
public: 
    A(){} 

    void initB(A& a){b(a); cout << "A call init B \n"; } 
private: 
    // other members ... 

    B b; 
}; 

int main() 
{ 
    A a; 
    a.initB(a); 

} 

の他のデータメンバーとBを初期化する必要がありますA. のメンバーである私は、エラーをコンパイルしました:

classIns.cpp: In constructor âA::A()â: 
classIns.cpp:14: error: no matching function for call to âB::B()â 
classIns.cpp:8: note: candidates are: B::B(A&) 
classIns.cpp:6: note:     B::B(const B&) 
classIns.cpp: In member function âvoid A::initB(A&)â: 
classIns.cpp:16: error: no match for call to â(B) (A&)â 

なぜA(){}はB :: B()を呼び出す必要がありますか?

Aの他のデータメンバーでBを初期化するにはどうすればよいですか?

感謝

このよう
+0

なぜ5つの答えがあり、 "イニシャライザーリスト" < - そのインスタンス以外のインスタンスはありません? –

答えて

4

BががAのctorの中でそれを初期化するためにしているあなたにを意味デフォルトコンストラクタを持っていません。

struct A { 
    A() : b(*this) {} 
private: 
    B b; 
}; 

あなたはinit様部材を用いると思うときはいつでも、あなたはおそらく、それは間違ってやっています。オブジェクトは、コンストラクターの実行後に常に有効でなければなりません。

+0

@ user1000107:これは初期化子リストと呼ばれ、すべてのメンバーを初期化するための推奨される方法です。 –

1

void initB(A& a){ 
    b = B(a); 
    cout << "A call init B \n"; 
} 

オフコース、クラスBは、デフォルトコンストラクタが必要で、タイプAのオブジェクトへの参照をとるコピーコンストラクタ

+0

コンストラクタは何も割り当てないために** nothing **を返します。 – Mahesh

+0

@Maheshいいえ、そうではありません。しかし、クラスBは 'B&operator =(const A&)'として宣言された代入演算子を持つべきです。 –

+0

その場合、 'b = a;'で十分です。作成される一時的な型は 'B'型で、現在の代入演算子の引数(const A&)と互換性がありません。だから、私は '= '演算子でさえ提供されていると信じています。あなたが' b = a; do;を実行しない限り、スニペットはコンパイルされません。 – Mahesh

0

Why A(){} needs to call B::B() ?

Aには、Aクラスのインスタンスを作成するときに初期化する必要があるデータメンバーBがあるためです。あなたの場合、bはデフォルトのB c'torで初期化されます。

あなたはB

public: 
    B(A& a){cout << "B constr is run \n";} 

のコンストラクタを指定しているので、デフォルトコンストラクタ:

B(){} 

は、コンパイラによって自動的に生成されません。だからそれは不平を言う。

1

あなたは、コンストラクタで初期化チェーンを使用することができます。

class B 
{ 
    public: 
     B(Type1 x, Type2 y) 
     { 

     } 
     void init(Type1 x, Type2 y) { ........} 
}; 
class A 
{ 
    public: 
     A() : Amember1(), Amember2(), b(Amember1, Amember2) {} 
    private: 
     Type1 Amember1; 
     ..... 
     B b; 
}; 

が、Bがすでに構築されているので、あなたはinitBメソッド内Bのコンストラクタを呼び出すことはできません。 あなたが好きな、データとB::init()メソッドを使用することができます。

void A::initB(A& a){ b.init(a.Amember1, a.Amember2); cout << "A call init B \n"; } 
関連する問題