5

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

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 中的此功能,那就更好了。

4

5 回答 5

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++ 功能(除非您为一个好的编译器付费)。

于 2012-10-20T11:45:18.457 回答
1

那是因为您的构造函数有问题:

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

A:A(0,0){ }

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

于 2012-10-20T11:42:16.400 回答
0

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

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

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

于 2012-10-20T11:44:58.080 回答
0

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

于 2012-10-20T11:45:56.970 回答
0

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

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

你用什么编译器?

于 2012-10-20T11:46:46.677 回答