我使用这个非常简单的类,而不使用任何继承。
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中更详细地阐述转发构造函数和这个特性,那就更好了。
发布于 2012-10-20 11:45:18
如果可以使用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++特性(除非您为一个好的编译器付费)。
发布于 2012-10-20 11:42:16
这是因为构造函数存在以下问题:
从您的错误消息的外观来看,我假设您在Visual上(可能是2010年),我同意,它在VS2010中不起作用。
A:A(0,0){ }修正VS 2010及其前身:A():a(0),b(0){}
发布于 2012-10-20 11:44:58
您不能这样做,A() :A(0,0){};用这种方式初始化类基成员。
A(){a=0;b=0;};或者如果您希望定义private: void set(int x, int y);并在构造函数中使用它。
https://stackoverflow.com/questions/12988048
复制相似问题