2014-04-16 36 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

这是真的,但并没有解释为什么在此代码中需要使用默认构造函数。 –

相关问题