C ++:编译器抱怨构造函数中的变量初始化

时间:2010-06-24 13:29:56

标签: c++ constructor initialization

我的标题“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
}

但我正在构造函数体中的(空)初始化列表之后初始化它。

我该如何解决这个问题?如果它有一个名字,这个问题怎么称呼?

由于

4 个答案:

答案 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的成员。