gpt4 book ai didi

c++ - 非法成员初始化

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:44 25 4
gpt4 key购买 nike

我正在使用这个非常简单的类,没有使用任何继承。

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) ;
}

我收到这个错误。

error C2614: 'A' : illegal member initialization: 'A' is not a base or member

SO 上也有类似的问题,但它们与继承有关。有人可以解释原因吗?标准对此有何规定?

编辑:

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

最佳答案

如果可以使用 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 不是基数 时的意思,它期待这种情况。

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

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

关于c++ - 非法成员初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12988048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com