非法成员初始化

Cod*_*ash 5 c++ oop constructor 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) ;
}
Run Code Online (Sandbox Code Playgroud)

我收到这个错误.

错误C2614:'A':非法成员初始化:'A'不是基础或成员

SO上也有类似的问题,但它们与继承有关.有人可以解释原因以及标准对此有何看法?

编辑:

如果有人在C++ 11中详细说明了转发构造函数和这个特性,那会更好.

ale*_*nis 5

如果你可以使用C++ 11,你可以初始化A()A(int, int).这在C++ 03中是不可能的,在C++ 03中你必须编写两个单独的构造函数.

如果您希望代码在C++ 03中工作,您有两种选择:

  • 创建一个函数init(int, int)并从每个构造函数中调用它.如果你的构造函数做了很多工作,这是一个很好的选择.
  • 两个构造函数中的重复行为.当您所做的只是成员初始化时,这是一个很好的选择.

您还可以从子类构造函数中调用基础构造函数.例如,如果你有

class A {
    A(int, int);
};
class B : public A {
    B(int, int);
};
Run Code Online (Sandbox Code Playgroud)

你可以写

B::B(int x, int y) : A(x,y) {}
Run Code Online (Sandbox Code Playgroud)

这就是你的编译器所说的那样A is not a base,它正在期待这种情况.

所有这些都与C++ 03兼容.

您还可以升级编译器以支持C++ 11功能.如果您在Linux中工作并希望您的项目在Windows中编译,我不建议这样做,因为Windows编译器没有实现Linux编译器所做的所有C++功能(除非您为一个好的编译器付费).