非法会员初始化

Illegal Member initialization

本文关键字:初始化 非法      更新时间:2023-10-16

我正在使用这个非常简单的类而无需使用任何继承。

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中引入的语言功能,并且尚未在每个编译器中实现。