我的标题“Test.h”中有一个类的变量,它没有没有参数的构造函数。 我有一个像这样的构造函数:
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
}
但我正在构造函数体中的(空)初始化列表之后初始化它。
我该如何解决这个问题?如果它有一个名字,这个问题怎么称呼?
由于
答案 0 :(得分:14)
您需要使用初始化列表。
Test::Test() : theVar(1, 2) {}
如果问题是i
是其他函数调用的结果,你可以像
Test::Test() : theVar(1, compute_i()) {}
问题是构造函数体在>>初始化所有成员后执行。
首先通过调用初始化列表中指定的构造函数来初始化它们,如果该成员未在其中列出,则通过调用其默认构造函数来初始化。
这就是为什么你得到错误抱怨Beer::Beer()
的原因:因为没有指定其他内容,它会尝试调用该构造函数来初始化theVar
,但它不存在。
然后在所有成员初始化之后,执行构造函数体(执行赋值,而不是theVar
的初始化。但是编译器永远不会那么远,因为它无法执行初始化。
答案 1 :(得分:3)
您必须为具有参数化构造函数的每个成员变量使用初始化列表:
Test::Test() :
theVar( 1, 2 )
{
}
如果您需要在运行时可计算参数 - 请使用静态成员函数并将调用插入到初始化列表中。
答案 2 :(得分:1)
您需要提供默认的c'tor,因为编译器将在运行之前对所有类成员执行默认初始化。这是无法避免的。但是,您可以使用c'tor初始化列表来指定自定义c'tor(我假设您知道)。
一个潜在的解决方法是将此类私人默认广告添加到Beer
,并使Test
成为Beer
的朋友,以防止其他人意外调用它。
Base
它有一个有意义的默认c'tor,或重新设计Test
,你可以在c'tor初始化列表中初始化Base
。
答案 3 :(得分:1)
像这样写:
Test::Test()
: theVar(1, 2)
{ }
否则编译器会在进入构造函数体之前尝试使用默认构造函数初始化Beer。您必须在进入构造函数体之前初始化成员变量。
您也可以考虑使用默认构造函数,并在构造函数体中设置Beer的成员。