2014-04-16 56 views
-2

我有以下類別:爲什麼你必須定義一個空的構造C++

class ArithmeticExpression 
{ 
public: 
    ArithmeticExpression(std::string expr); 
} 


class Command 
{ 
public: 
    Command(){}; 
    //this is a virtual class 
} 

class CommandAssign : public Command 
{ 
private: 
    ArithmeticExpression expr; 

public: 
    CommandAssign(); 
    CommandAssign(ArithmeticExpression); 
} 

現在,當我嘗試寫的CommandAssign類的構造函數爲:

CommandAssign::CommandAssign(ArithmeticExpression expr) 
    :Command() 
{ 
    this -> expr = ArithmeticExpression(expr.getExpr()); 
} 

我得到錯誤:

沒有匹配函數調用'ArithmeticExpression :: ArithmeticExpression()' :Command()

顯然我可以通過在ArithmeticExpression類中添加一個空構造函數來解決這個問題,該類不會做任何事情。這個空的構造函數讓它工作起來有什麼特別之處?我不明確地打電話到任何地方。你是否總是需要在C++中定義一個空構造函數?

我想強調的是,儘管從標題看來,我的問題似乎與某些用戶建議的副本類似,但我所尋找的答案並不存在。我只是想了解在構造函數被調用時會發生什麼,以及如何避免定義一個無用的默認構造函數,我知道這已經不是由編譯器自動定義的,在這種情況下,我使用參數定義了構造函數。

+1

請參閱相關:http://stackoverflow.com/questions/5498937/when-do-we-need-to-have-a-default-constructor – EdChum

+0

當您向類中添加構造函數時,默認構造函數不是自動生成更多。 –

+0

您的'Command'類嵌入了'ArithmeticExpression'的私有實例,該實例在當前代碼中默認構造,'ArithmeticExpression'定義了一個非默認構造函數,所以是的,您需要向該類添加默認構造函數。 –

回答

2

所有成員都在之前初始化構造函數體開始。如果在初始化列表中沒有條目,則它將被默認初始化;但如果它有一個默認的構造函數,這是唯一可能的(對於類類型)。

expr未在初始化列表中初始化,並且沒有默認構造函數(因爲聲明任何構造函數都阻止了隱式生成),所以無法初始化 - 因此是錯誤。

你應該初始化它在列表中,而不是在構造函數體中重新分配它:

CommandAssign::CommandAssign(ArithmeticExpression expr) : 
    expr(expr.getExpr()) 
{} 

注意,沒有必要明確地默認,構建Command子對象。這也需要ArithmeticExpression的構造函數公開:它在您的示例代碼中是私有的。

+0

我明白了。非常感謝。 – alinafdima

3

如果沒有定義其他構造函數,只會由編譯器自動生成默認構造函數。

編輯:

對象初始化需要默認構造函數。

+0

這是真的,但並沒有解釋爲什麼在此代碼中需要使用默認構造函數。 –

相關問題