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

时间:2015-01-16 18:15:26

标签: c++ c++11 struct constructor c++03

前段时间我编写的代码类似于:

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 ++。

3 个答案:

答案 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;
            }
        }
    }