2011-10-29 118 views
0

我有A類和B B是A 的一員,我需要與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); 

} 

我得到了編譯錯誤:

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

爲什麼有五個答案,沒有「初始化程序列表」的實例< - 除了一個? –

回答

4

B沒有默認構造函數,這意味着你已經初始化它A的構造函數。

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;' – Mahesh

0

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

因爲A有一個數據成員B,當您創建A類的一個實例時,需要對其進行初始化。在你的情況b用默認的B c'tor初始化。

由於要指定一個構造爲乙

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"; } 
相關問題