非法成员初始化

时间:2012-10-20 11:40:17

标签: 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) ;
}

我收到此错误。

  

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

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

修改

如果有人在C ++ 11中详细说明转发构造函数和此功能,那会更好。

5 个答案:

答案 0 :(得分:5)

如果您可以使用C ++ 11,则可以从A()初始化A(int, int)。这在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 ++功能(除非您支付好的编译器)。

答案 1 :(得分:1)

这是因为您在以下构造函数中遇到问题:

从错误消息的外观来看,我假设您使用的是Visual Studio(可能是2010)并且我同意,它在VS2010中不起作用。

A:A(0,0){ }

修复VS 2010及其前身:A():a(0),b(0){}

答案 2 :(得分:0)

你不能这样做A() :A(0,0){};这种方式用于初始化类库成员。

A(){a=0;b=0;};

或者如果您希望定义private: void set(int x, int y);并在构造函数中使用它。

答案 3 :(得分:0)

您正在尝试使用委托构造函数,该构造函数是仅在C++11中引入的语言功能,并且尚未在每个编译器中实现。

答案 4 :(得分:0)

A() :A(0,0){};称为构造函数链接。

您应该检查编译器是否接受C ++ 11。构造函数链接仅在C ++ 11中有效。以前没有。

你使用什么编译器?