C ++初始化派生类列表无法编译,为什么?

时间:2017-02-23 04:45:14

标签: c++ list class constructor derived

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

#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){}
          ^~~~~~

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

3 个答案:

答案 0 :(得分:3)

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

构造函数初始值设定项列表只能初始化直接类或结构成员,而不能初始化基类中的成员。或者&#34;打电话&#34;基类构造函数。

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

Derived() : Base(3) {}

答案 1 :(得分:3)

编译器的错误消息足够清楚。

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

Derived():m_i(3){}

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

Derived() { m_i = 3; }

答案 2 :(得分:2)

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

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

另一个是分配变量而不是初始化变量,如下所示:

{{1}}