我有以下课程:
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()'的匹配函数 :命令()
显然我可以通过在ArithmeticExpression类中添加一个不执行任何操作的空构造函数来解决这个问题。这个空构造函数有什么特别之处才能使它工作?我没有明确地呼吁任何地方。你总是需要在C ++中定义一个空构造函数吗?
我想强调的是,虽然从标题看来我的问题似乎与一些用户建议的副本相似,但我所寻找的答案并不存在。我只是试图理解在调用构造函数时会发生什么以及如何避免定义无用的默认构造函数,我知道在我使用参数定义一个构造函数时,编译器不会自动定义它。
答案 0 :(得分:4)
如果没有定义其他构造函数,则只会由编译器自动生成默认构造函数。
编辑:
对象初始化需要默认构造函数。
答案 1 :(得分:3)
在构造函数体开始之前,所有成员都已初始化。如果初始化列表中没有条目,则默认初始化;但这只有(对于类类型),如果它有一个默认的构造函数。
expr
未在初始化列表中初始化,并且没有默认构造函数(因为声明任何构造函数都无法隐式生成),因此无法初始化 - 因此错误。
您应该在列表中初始化它,而不是在构造函数体中重新分配它:
CommandAssign::CommandAssign(ArithmeticExpression expr) :
expr(expr.getExpr())
{}
请注意,不需要显式默认构造Command
子对象。这也要求ArithmeticExpression
的构造函数是公开的:它在您的示例代码中是私有的。