2012-08-15 251 views
0

我具有限定的結構像這樣的:結構成員初始化

typedef struct tag_GLOBAL_VAR 
{ 
    int array1[4]; 
    int array2[5]; 
    ....... 
    int array20[40]; 
}GLOBAL_VAR; 

該結構用於在某些類定義一個變量:

GLOBAL_VAR g_GlobalVar; 

,然後在這樣的另一個類中:

extern GLOBAL_VAR g_GlobalVar; 

class constructor; 

class destructor; 

int class::Start() 
{ 
    //g_GlobalVar.array1 = {1,2,3,4}; 
    //g_GlobalVar.array4 = {1,2,3}; 
    some code; 
} 

我的問題是,我不能初始化(註釋行)那樣的2個數組,我得到了來自VS的。爲什麼這是錯的,哪個是解決方案呢?

+0

您正在使用C++ 11? – 2012-08-15 12:31:44

+0

我真的不知道......我使用沒有SP的vs2008。 – MRM 2012-08-15 12:32:27

+0

有點偏離主題,但考慮使用容器而不是數組 – SingerOfTheFall 2012-08-15 12:32:38

回答

1

您不能在聲明後以這種方式初始化數組的值。

int array[5] = {1, 2, 3, 4, 5}; 

在其他地方,你將不得不設置每一個元素:當你聲明並設置數組一次,這樣那樣的語法是唯一可能的。

5

這是錯誤的,因爲這不是初始化,而是設置一個新值。聲明g_GlobalVar時,您的數組已經初始化。

我看到2解決方案:A)創建新的數組,初始化他們就像你試圖做的,並在你的數組循環中複製新的數組; B)分別設置每個陣列的每個條目。

0

就地初始化({...})僅在POD的C++ 11中受支持。

1

如果您需要一次初始化幾個成員陣列,你可以做以下

const GLOBAL_VAR my_const = {{1,2,3,4}, {}, {}, {1,2,3}}; 
g_GlobalVar = my_const; 
+0

我已經在其他地方看到了這種方法,並且根據我對數組的瞭解,這將使用這些值初始化前兩個數組,其餘爲'0'。如果我想初始化結構體的第22和第24個數組怎麼辦?我需要初始化結構的所有前24個數組,對嗎? – MRM 2012-08-15 12:42:28

+0

@MRM:是的,您必須初始化所有數組,至少使用{}。 – Andrey 2012-08-15 12:49:44

+0

在你的後一個例子中,你似乎沒有使用C++中的數組賦值。 – 2012-08-15 12:49:46

2

特殊的數組初始化語法只適用於,你猜對了,數組初始化。在其他時候,您必須逐個設置值。

然而,分配結構(與初始值相結合)允許的快捷方式,就像這樣:

GLOBAL_VAR temporary = { {1,2,3}, {4,5,6} }; 
g_GlobalVar = temporary; 

其他的解決方案包括使用memcpy

int temp1[] = {1,2,3,4}; 
memcpy(g_GlobalVar.array1, temp1, sizeof temp1);