gpt4 book ai didi

c++ - 修复已添加构造函数的结构的初始化

转载 作者:搜寻专家 更新时间:2023-10-31 01:02:00 24 4
gpt4 key购买 nike

不久前我写了类似这样的代码:

struct Thing
{
int a,b;
};

struct Junk
{
double x;
Thing things[10];
};


Junk myjunk[] =
{
{ 23.4, { {10,20}, {30,40} } },
{ 45.6, { {55,66}, {77,88} } }
};

最初 Thing 没有构造函数 - 只是一个扁平的简单结构来保存几个整数。 myjunk[] 是一种特殊的手写数据,用于输入某些内容。在现实生活中,它有几十行,而不仅仅是两行。这段代码编译得很好。

然后今天早上我向 Thing 添加了构造函数,这在伟大的事物方案的其他地方很有用,例如,调用像 blarf(Thing(123,456)) 这样的函数;并使用“new”在堆上创建巨大的数组。

struct Thing
{
int a,b;
Thing();
Thing(int _a, int _b);
};

现在它无法编译。我明白了

Error 1 error C2552: 'Junk::things' : non-aggregates cannot be initialized with initializer list

是的,带有构造函数的类不能以这种方式创建。获得此编译的最快最简单的修复方法是什么?

我知道 C++11 允许一些新的方法来初始化变量,但在这种情况下不清楚什么是最好的。我不是在创建一个单独的事物,而是在另一个结构中创建一个数组。 “垃圾”永远不会有构造函数。

请注意,任何地方都没有任何虚拟方法,Thing 和 Junk 也永远不会。我正在使用 Visual Studio 2010,但不确定它是否将源代码设为 C++11 或更早的 C++。

最佳答案

{10, 20} 更改为 Thing(10, 20) 等等。

如果您使构造函数 constexpr 以语言版本为条件,那么一旦升级到现代编译器,您将能够再次在编译时初始化对象:

#if __cplusplus >= 201103L
constexpr
#endif
Thing() : a(0), b(0) {}

#if __cplusplus >= 201103L
constexpr
#endif
Thing(int a, int b) : a(a), b(b) {}

关于c++ - 修复已添加构造函数的结构的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27990240/

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