2010-06-24 85 views
1

我在頭文件「Test.h」中有一個沒有無參數構造函數的類的變量。 我有這樣的構造:C++:編譯器抱怨變量初始化在構造函數中

Test::Test() // <-- Here he complains: 
      // error: no matching function for call to ‘Beer::Beer()’ 
{ 
    int i = 2; 
    theVar = Beer(1, i); // Beer(int, int) is the only constructor 
} 

但我的(空)的初始化列表後對其進行初始化,在構造函數體。

我該如何解決這個問題?如果這個問題有名稱,這個問題如何?

謝謝

回答

14

您需要使用初始化列表。

Test::Test() : theVar(1, 2) {} 

如果問題是i一些其他的函數調用的結果,你可以做sometihng像

Test::Test() : theVar(1, compute_i()) {} 

的問題是,在構造函數體中執行的所有成員都被初始化

通過調用初始化程序列表中指定的任何構造函數,並通過調用其默認構造函數,如果該成員沒有在那裏列出,則首先初始化它們。

這就是爲什麼你得到錯誤抱怨Beer::Beer():因爲沒有其他指定,它會嘗試調用該構造函數初始化theVar,它不存在。

然後後,所有成員都被初始化,執行構造函數體(在這裏你執行theVar分配,而不是初始化,但是編譯器從來沒有得到那麼遠,因爲它無法執行。初始化

+0

非常感謝您的解釋。 – 2010-06-24 13:38:47

3

你必須使用具有參數的構造函數每一個成員變量的初始化列表:

Test::Test() : 
    theVar(1, 2) 
{ 
} 

,如果你需要的參數是在運行時可計算 - 使用爲static c成員函數,並將調用插入到初始化程序列表中。

1

您需要提供一個默認的c'tor,因爲編譯器會在c'tor運行前之前對所有類成員執行默認初始化。這是無法避免的。但是,您可以使用c'tor初始化程序列表來指定自定義c'tor(我假設您知道這一點)。

一個潛在的解決方法是將這樣一個私人默認c'tor添加到Beer並使Test成爲Beer的朋友,以防止他人意外調用它。

然而,這是一個設計缺陷。最好的方法是重新設計Base它有一個有意義的默認c'tor,或重新設計Test,您可以在c'tor初始化程序列表中初始化Base

1

這樣寫:

Test::Test() 
    : theVar(1, 2) 
{ } 

否則編譯器會嘗試在進入構造函數體前,用默認構造函數初始化啤酒。在輸入構造函數體之前,您必須初始化成員變量。

你也可以考慮有一個默認的構造函數,並在構造函數體內設置Beer的成員。