2012-05-28 87 views
4
class A { 
public: 
    A(int v) { 
     _val = v; 
    } 

private: 
    int _val; 
}; 

class B { 
public: 
    B(int v) { 
     a = A(v); // i think this is the key point 
    } 

private: 
    A a; 
}; 

int main() { 
    B b(10); 

    return 0; 
} 

編譯器說:構造函數可以在C++中調用另一個類的構造函數嗎?

test.cpp: In constructor ‘B::B(int)’: 
test.cpp:15: error: no matching function for call to ‘A::A()’ 
test.cpp:5: note: candidates are: A::A(int) 
test.cpp:3: note:     A::A(const A&) 

我學會了Java的,我不知道如何處理這在C++。 尋找幾天,PLZ告訴我可以C++做到這一點?

回答

15

您需要使用Member Initialization List

B(int v):a(v) 
{ 
} 

有了:

B(int v) 
{ 
     a = A(v); // i think this is the key point 
} 

a分配一個值,而不是被初始化這就是你打算),一旦構造函數的主體開始{,其所有成員都已構建。

爲什麼會出現錯誤?
的編譯器構造a構造體{開始之前,編譯器使用的A無參數的構造函數,因爲你沒有告訴它,否則注1,由於默認的無參數的構造函數不可因此錯誤。

爲什麼默認沒有參數構造函數不是隱式生成的?
一旦您爲您的類提供了任意構造函數,則不會生成隱式生成的無參數構造函數。您爲構造函數A提供了重載,因此不存在無參數構造函數的隱式生成。

注1
使用成員初始化列表是告訴編譯器使用構造函數,而不是默認的無參數的構造函數的重載特別版本的方式。

2

是的,可以,但你有沒有爲A默認構造函數(不帶參數或所有參數的默認值),所以你只能在初始化列表初始化:

B(int v) : a(v) 
{ 
} 

這是因爲在構造函數體輸入之前,a將用默認的構造函數(不可用)構造(或嘗試構造)。

6

你必須使用初始化列表:

class B { 
public: 
    B(int v) : a(v) { // here 

    } 

private: 
    A a; 
}; 

否則編譯器會嘗試使用默認構造函數構造一個A。既然你沒有提供,你會得到一個錯誤。

相關問題