派生class 的C++ 初始化列表编译失败,为什么?
C++ initialization list of derived class failed to compile, why?
我有一个简单的程序来测试初始化列表,如下所示:
#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
可以在 Derived
结构中使用,但它实际上并不是 Derived
结构的 成员 ,因此可以不能在构造函数初始化列表中使用。
构造函数初始化列表只能初始化direct class或结构成员,不能初始化class基类的成员。或者 "call" 基础 class 构造函数。
您应该添加一个 Base
构造函数,将 m_i
的值作为参数,并在 Derived
初始化列表中使用该构造函数:
Derived() : Base(3) {}
编译器的错误信息很清楚。
m_i
既不是 class 的非静态数据成员,也不是基础 class。因此,它不能用于
Derived():m_i(3){}
如果要将 m_i
的值设置为 3
,可以使用构造函数的主体来实现。
Derived() { m_i = 3; }
您不能从另一个 class 初始化一个 class 的成员,包括第一个 class 的派生 class。您可以通过几种不同的方式做您想做的事。一种是使用构造函数并将 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;
}
};
我有一个简单的程序来测试初始化列表,如下所示:
#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
可以在 Derived
结构中使用,但它实际上并不是 Derived
结构的 成员 ,因此可以不能在构造函数初始化列表中使用。
构造函数初始化列表只能初始化direct class或结构成员,不能初始化class基类的成员。或者 "call" 基础 class 构造函数。
您应该添加一个 Base
构造函数,将 m_i
的值作为参数,并在 Derived
初始化列表中使用该构造函数:
Derived() : Base(3) {}
编译器的错误信息很清楚。
m_i
既不是 class 的非静态数据成员,也不是基础 class。因此,它不能用于
Derived():m_i(3){}
如果要将 m_i
的值设置为 3
,可以使用构造函数的主体来实现。
Derived() { m_i = 3; }
您不能从另一个 class 初始化一个 class 的成员,包括第一个 class 的派生 class。您可以通过几种不同的方式做您想做的事。一种是使用构造函数并将 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;
}
};