2014-10-27 197 views
0

我有2個類A和B.我試圖用B類的默認構造函數來調用類A的默認構造函數來初始化類A中的值B.C++一個類的默認構造函數調用另一個類的另一個默認構造函數

class A 
{ 
    A();  
    int x; 
} 

A::A() 
{ 
    //initialized x 
    x=10; 
} 

class B 
{ 
    B(); 
    A aobj; 
} 

B::B() 
{ 
    //Calling class A's default constructor to initialize B's aobj. 
    aobj(); 
} 

我收到了'(aobj)'的不匹配呼叫。請幫我解決。

+0

您不是調用'A'的構造函數,而是試圖調用不存在的函數調用操作符('A :: operator()()')。構造函數是未命名的特殊成員函數,不能像這樣直接訪問。 – 2014-10-27 15:20:45

+0

也許你應該熟悉[成員初始值列表](http://en.cppreference.com/w/cpp/language/initializer_list)。 – Sambuca 2014-10-27 15:25:34

回答

3

其實,你並不需要顯式默認構造成員,除非你明確構建成員,否則會自動發生。如果你想真正構建一個成員明確,無論是默認的建設或別的東西,你需要把你的初始化到成員初始化列表:

B::B() 
    : aobj() { 
} 

在函數體的表達aobj()嘗試使用成員aobj上的函數調用運算符。這樣做可能是合理的,例如,當aobjstd::function<void()>類型時。

2

在聲明的上下文中,aobj()不會嘗試構造aobj變量,而是會嘗試使用運算符重載調用它operator()

相反,嘗試在做B::B()的初始化列表建設:

B::B() : aobj() 
{ 
} 

但是請注意,這是多餘的,因爲對於成員對象默認的構造函數,如果從初始化列表省略將被隱式調用。也就是說,這種構造會做同樣的事情:

B::B() { } 
相關問題