2013-10-02 42 views
7

我的任务是删除一些编译器警告。我已经能够将问题归结为下面的例子,我正在抓我的头,为什么它不起作用。我想我不知道如何初始化C++中的东西。任何帮助,将不胜感激。初始化数组中结构中数组的结构出现问题

我用G ++像这样: G ++ init_arr.cpp

下面的代码。我想所有的人初始化在过道比萨饼中的所有表:

// 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’ 
+8

+1创建一个最小的测试用例。 –

+1

你刚刚错过了很多大括号。作为理解的帮助,考虑Aisle拥有更多成员而不是ais的情况。你会把这些成员放在哪里? – Tobias

+0

感谢您的回答。 – Bitdiot

回答

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 } 
     } 
     } 
     } 
    }; 
+0

谢谢。为答案。谢谢你指出我的误解。我给你了复选标记! – Bitdiot

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

+1,这确实很整洁。 – us2012

+0

这是一个非常清晰的答案。感谢它。 – Bitdiot

+0

我也想给你一个复选标记。我把它给了很多大括号的答案,因为他在跟踪我的大括号时表现出了我的思维错误。但这绝对是一个好答案。再次感谢。 – Bitdiot

2

每个块需要表示一个对象。 Aisle结构体包含一个数组对象(ais)。 ais数组的每个元素都包含一个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] 
       } 
      } 

     } 
    }; 
+0

感谢您的回答! – Bitdiot