在结构中的数组中的结构中初始化数组时出现问题

时间:2013-10-02 19:50:41

标签: c++ arrays struct initialization

我的任务是删除一些编译器警告。我已经能够将问题归结为以下示例,我为什么不能正常工作而感到头疼。我想我不知道如何用C ++初始化东西。任何帮助将不胜感激。

我像这样使用g ++: g ++ init_arr.cpp

这是代码。我想在Aisle pizza的所有桌子上初始化所有人:

// init_arr.cpp
#include <iostream>
#include <string>
#include <sstream>

using namespace std;


struct Person {
    int    id;
    string name;
    double money;
};


struct Table {
    Person tab[4];
};


struct Aisle {
    Table ais[3];
};

int main() {
    cout << "main function()" << endl;

    Aisle pizza =
        {
            {  // Table 0
                { 0, "Tom", 100.0 },
                { 1, "Mary", 101.0 },
                { 2, "Jane", 103.0 },
                { 3, "Joe",  104.0 }
            },

            {  // Table 1
                { 0, "Tom", 100.0 },
                { 1, "Mary", 101.0 },
                { 2, "Jane", 103.0 },
                { 3, "Joe",  104.0 }
            },

            {  // Table 2
                { 0, "Tom", 100.0 },
                { 1, "Mary", 101.0 },
                { 2, "Jane", 103.0 },
                { 3, "Joe",  104.0 }
            }
        };

    return 0;
}

我认为上述内容可行,但我收到以下错误:

g++ init_arr.cpp -std=gnu++0x
init_arr.cpp: In function ‘int main()’:
init_arr.cpp:49: error: too many initializers for ‘Table [3]’
init_arr.cpp:49: error: too many initializers for ‘Aisle’

3 个答案:

答案 0 :(得分:8)

虽然@ us2012显示了什么有效,并提供了一个很好的解释(+1给他),但我觉得它不太可读。这是另一种选择:

Aisle pizza =
    {
        Table {  // Table 0
            Person { 0, "Tom", 100.0 },
            Person { 1, "Mary", 101.0 },
            Person { 2, "Jane", 103.0 },
            Person { 3, "Joe",  104.0 }
        },

        Table {  // Table 1
            Person { 0, "Tom", 100.0 },
            Person { 1, "Mary", 101.0 },
            Person { 2, "Jane", 103.0 },
            Person { 3, "Joe",  104.0 }
        },

        Table {  // Table 2
            Person { 0, "Tom", 100.0 },
            Person { 1, "Mary", 101.0 },
            Person { 2, "Jane", 103.0 },
            Person { 3, "Joe",  104.0 }
        }
    };

答案 1 :(得分:6)

你缺少很多的括号对。我添加了注释,以便更清楚地从哪个位开始。

要把它放到一个句子中,你的问题是可以使用{1,2,3}初始化包含三个元素的数组,而包含数组作为其单个成员的结构是一个额外的层,因此必须初始化{ {1,2,3} } - 外层是struct,内层是数组。

Aisle pizza =
    { // Aisle init
      { // Table ais[3] init
        {  // ais[0] init
         {  // Person tab[4] init
            { 0, "Tom", 100.0 },
            { 1, "Mary", 101.0 },
            { 2, "Jane", 103.0 },
            { 3, "Joe",  104.0 }
         }
        },

        {  // ais[1] init
         {  // Person tab[4] init
            { 0, "Tom", 100.0 },
            { 1, "Mary", 101.0 },
            { 2, "Jane", 103.0 },
            { 3, "Joe",  104.0 }
         }
        },

        {  // ais[2] init
         {  // Person tab[4] init
            { 0, "Tom", 100.0 },
            { 1, "Mary", 101.0 },
            { 2, "Jane", 103.0 },
            { 3, "Joe",  104.0 }
         }
        }
      }
    };

答案 2 :(得分:2)

每个块都需要表示一个对象。 Aisle struct包含一个数组对象(ais)。 ais数组的每个元素都包含一个Table结构。每个Table结构都包含一个数组对象(tab)。等等...

试试这个:

    Aisle pizza =
    { // Aisle
        { // .ais
            {  // .ais[0]
                { // .ais[0].tab
                    { 0, "Tom", 100.0 },  // tab[0]
                    { 1, "Mary", 101.0 }, // tab[1]
                    { 2, "Jane", 103.0 }, // tab[2]
                    { 3, "Joe",  104.0 }  // tab[3]
                }
            },

            {  // .ais[1]
                { // .ais[1].tab
                    { 0, "Tom", 100.0 },  // tab[0]
                    { 1, "Mary", 101.0 }, // tab[1]
                    { 2, "Jane", 103.0 }, // tab[2]
                    { 3, "Joe",  104.0 }  // tab[3]
                }
            },

            {  // .ais[2]
                { // .ais[2].tab
                    { 0, "Tom", 100.0 },  // tab[0]
                    { 1, "Mary", 101.0 }, // tab[1]
                    { 2, "Jane", 103.0 }, // tab[2]
                    { 3, "Joe",  104.0 }  // tab[3]
                }
            }

        }
    };