【问题标题】:C++ initialization list of derived class failed to compile, why?C++派生类初始化列表编译失败,为什么?
【发布时间】:2017-07-13 10:21:46
【问题描述】:

我有一个简单的程序来测试初始化​​列表,如下:

#include<stdio.h>
struct Base{
    Base():m_i(2){}
    int m_i;
};
struct Derived:Base{
    Derived():m_i(3){}
};
int main()
{
    Derived d;
    return 0;
}

令我惊讶的是,它无法编译。 gcc 和 clang 都给出了错误:

1.cpp:7:15: error: member initializer 'm_i' does not name a non-static data member or base class
    Derived():m_i(3){}
          ^~~~~~

我在哪里出错以及如何解决?

【问题讨论】:

  • 您期望m_i 的值是多少? 3 还是 2?

标签: c++ list class constructor derived


【解决方案1】:

您不能从另一个类初始化一个类的成员,包括第一个类的派生类。有几种不同的方法可以让你做你想做的事。一种是使用构造函数并将 i 的值作为参数传递给它,如下所示:

struct Base{
    Base(int i=2):m_i(i){}
    int m_i;
};
struct Derived:Base{
    Derived():Base(3){}
};

另一个是只分配变量而不是初始化它,像这样:

struct Derived:Base{
    Derived(){
        m_i=3;
    }
};

【讨论】:

    【解决方案2】:

    编译器的错误信息已经很清楚了。

    m_i 既不是类的非静态数据成员,也不是基类。因此,它不能用于

    Derived():m_i(3){}
    

    如果您想将m_i 的值设置为3,您可以使用构造函数的主体来执行此操作。

    Derived() { m_i = 3; }
    

    【讨论】:

      【解决方案3】:

      虽然m_i 可以在Derived 结构中使用,但它实际上不是Derived 结构的成员,因此不能在构造函数初始化列表中使用。 p>

      构造函数初始化列表只能初始化直接类或结构成员,不能初始化基类的成员。或者“调用”基类构造函数。

      您应该添加一个将m_i 的值作为参数的Base 构造函数,并在Derived 初始化列表中使用该构造函数:

      Derived() : Base(3) {}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-19
        • 1970-01-01
        • 2017-12-13
        • 2022-01-21
        • 2015-03-04
        • 1970-01-01
        相关资源
        最近更新 更多