2013-10-02 40 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