非法会员初始化
Illegal Member initialization
我正在使用这个非常简单的类而无需使用任何继承。
class A
{
int a;
int b;
public:
A(int x, int y) { a = x; b = y;}
A() :A(0,0){};
~A(){};
} ;
int main ()
{
A a1, a2(5, 7) ;
}
我有这个错误。
错误c2614:'a':非法成员初始化:'a'不是基础或成员
上面有类似的问题,但它们与继承有关。有人可以解释原因,标准对此有何评价?
编辑:
如果某人在C 11中详细介绍此功能,那会更好
如果可以使用C 11,则可以从A(int, int)
初始化A()
。在C 03中,这是不可能的,您必须在其中编写两个单独的构造函数。
如果您希望代码在C 03中使用,则有两个选择:
- 创建一个函数
init(int, int)
并从每个构造函数中调用它。如果您的构造函数做很多工作,这是一个不错的选择。 - 两个构造函数中的重复行为。当您所做的只是成员初始化时,这是一个不错的选择。
您也可以从子类构造函数中调用基本构造函数。例如,如果您有
class A {
A(int, int);
};
class B : public A {
B(int, int);
};
你可以写
B::B(int x, int y) : A(x,y) {}
这是您的编译器所说的A is not a base
时的意思,它正在期待这种情况。
所有这些都与C 03。
兼容您还可以升级编译器以支持C 11功能。如果您在Linux中工作并且希望您的项目在Windows中进行编译,我不建议这样做,因为Windows编译器无法实现Linux编译器所做的所有C 功能(除非您为好的编译器付费)。
<</p>这是因为您对构造函数的问题:
根据您的错误消息的外观,我假设您在Visual Studio(可能2010年),我同意,它在VS2010中无效。
A:A(0,0){ }
修复了VS 2010及其前任的修复:A():a(0),b(0){}
您不能以这种方式进行A() :A(0,0){};
以这种方式来初始化类基础成员。
A(){a=0;b=0;};
或者如果您希望定义private: void set(int x, int y);
并将其在构造函数中使用。
A() :A(0,0){};
称为构造器链接。
您应该检查编译器是否接受C 11。构造函链仅在C 11中有效。以前没有。
您使用什么编译器?
您正在尝试使用委派构造函数,这是仅在C++11
中引入的语言功能,并且尚未在每个编译器中实现。
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- WinLamb 错误:成员初始化非法
- 非法会员初始化
- C++模板类中的非法成员初始化
- 错误 C2614:'ChildClass':非法成员初始化:'var1'不是基或成员
- 为什么带逗号的双重初始化是非法的?
- C++ 代码错误(非法成员初始化、'class'类型重定义、'return':无法转换)