7

我的任务是删除一些编译器警告。我已经能够将问题归结为以下示例,我正在摸不着头脑,为什么它不起作用。我想我不知道如何在 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’
4

3 回答 3

7

虽然@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 }
        }
    };
于 2013-10-02T19:59:41.173 回答
5

你错过了很多对括号。我添加了注释,以便更清楚地从哪里开始。

总而言之,您的问题是可以初始化具有三个元素的数组,{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 }
         }
        }
      }
    };
于 2013-10-02T19:57:49.863 回答
2

每个块都需要代表一个对象。Aisle 结构包含一个数组对象(ais)。ais 数组的每个元素都包含一个 Table 结构。每个 Table 结构都包含一个数组对象(选项卡)。等等...

尝试这个:

    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]
                }
            }

        }
    };
于 2013-10-02T20:06:37.093 回答