首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非法成员初始化

非法成员初始化
EN

Stack Overflow用户
提问于 2012-10-20 11:40:16
回答 5查看 4K关注 0票数 5

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

代码语言:javascript
复制
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中更详细地阐述转发构造函数和这个特性,那就更好了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-20 11:45:18

如果可以使用C++11,则可以从A(int, int)初始化A()。这在C++03中是不可能的,因为您必须编写两个独立的构造函数。

如果希望代码在C++03中工作,则有两个选项:

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

还可以从子类构造函数调用基构造函数。例如,如果你有

代码语言:javascript
复制
class A {
    A(int, int);
};
class B : public A {
    B(int, int);
};

你可以写

代码语言:javascript
复制
B::B(int x, int y) : A(x,y) {}

这就是你的编译器的意思,当它说,A is not a base,它期待这种情况。

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

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

票数 5
EN

Stack Overflow用户

发布于 2012-10-20 11:42:16

这是因为构造函数存在以下问题:

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

代码语言:javascript
复制
A:A(0,0){ }

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

票数 1
EN

Stack Overflow用户

发布于 2012-10-20 11:44:58

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

代码语言:javascript
复制
A(){a=0;b=0;};

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12988048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档