【问题标题】:C++: Compiler complains about variables initialization in constructorC++:编译器抱怨构造函数中的变量初始化
【发布时间】:2010-06-24 13:29:56
【问题描述】:

我的头文件“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
}

但我在构造函数主体中的(空)初始化列表之后对其进行初始化。

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

谢谢

【问题讨论】:

    标签: c++ constructor initialization


    【解决方案1】:

    你需要使用初始化列表。

    Test::Test() : theVar(1, 2) {}
    

    如果问题是i 是其他函数调用的结果,你可以这样做

    Test::Test() : theVar(1, compute_i()) {}
    

    问题是构造函数体是在所有成员初始化之后执行的。

    它们首先通过调用初始化列表中指定的任何构造函数来初始化,如果该成员未在列表中列出,则调用其默认构造函数。

    这就是为什么您会收到抱怨 Beer::Beer() 的错误:因为没有指定其他任何内容,它会尝试调用该构造函数来初始化 theVar,但它并不存在。

    然后所有成员被初始化之后,构造器主体被执行(你在其中执行theVar赋值,而不是初始化。但编译器永远不会走那么远,因为它无法执行初始化。

    【讨论】:

    • 非常感谢您的解释。
    【解决方案2】:

    您必须为每个具有参数化构造函数的成员变量使用初始化列表:

    Test::Test() :
       theVar( 1, 2 )
    {
    }
    

    如果您需要参数在运行时可计算 - 为此使用静态成员函数并将对它们的调用插入到初始化列表中。

    【讨论】:

      【解决方案3】:

      您需要提供默认 c'tor,因为编译器将在 c'tor 运行之前对所有类成员执行默认初始化。这是无法避免的。但是,您可以使用 c'tor 初始化器列表来指定自定义 c'tor(我假设您知道这一点)。

      一种潜在的解决方法是向Beer 添加这样一个私有默认c'tor,并使Test 成为Beer 的朋友,以防止其他人意外调用它。

      然而,这是一个设计缺陷。最好的方法是重新设计Base,使其具有有意义的默认c'tor,或者重新设计Test,您可以在c'tor 初始化列表中初始化Base

      【讨论】:

        【解决方案4】:

        这样写:

        Test::Test() 
            : theVar(1, 2)
        { } 
        

        否则编译器会在 Beer 进入构造函数体之前尝试使用默认构造函数初始化它。必须在进入构造函数体之前初始化成员变量。

        您也可以考虑使用默认构造函数,并在构造函数主体内设置 Beer 的成员。

        【讨论】:

          猜你喜欢
          • 2020-08-29
          • 1970-01-01
          • 2014-05-19
          • 2018-06-30
          • 2020-09-27
          • 2015-02-19
          • 1970-01-01
          • 2011-01-22
          • 1970-01-01
          相关资源
          最近更新 更多