前段时间我编写的代码类似于:
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允许一些新的方法来初始化变量,但在这种情况下还不清楚什么是最好的。我不是在创建一个孤独的东西,而是一个数组,而在另一个结构中。 'Junk'永远不会有构造函数。
请注意,任何地方都没有任何虚拟方法,而且永远不会出现在Thing和Junk中。我正在使用Visual Studio 2010,并且不确定它是否将源代码转换为C ++ 11或更早版本的C ++。
答案 0 :(得分:2)
将{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) {}
答案 1 :(得分:1)
您的代码自C ++ 11起有效,因此您的编译器不得支持该代码。你可以做的是像这样初始化数组:
Junk myjunk[] =
{
{ 23.4, { Thing(10,20), Thing(30,40) } },
{ 45.6, { Thing(55,66), Thing(77,88) } }
};
答案 2 :(得分:1)
您可以使用以下
添加Junk的构造函数Junk(double _x, initializer_list<Thing> tl) : x(_x){
int i = 0;
for (auto & t : tl) {
things[i] = t;
++i;
if (i >= 10) {
break;
}
}
}