[英]How does one partially initialize an array of C structs in C++?
我有一個問題:使用以下C ++代碼(使用C樣式結構),我收到以下錯誤:
elements of partially initialized array must have a default constructor
我假設它正在談論不知道如何隱式初始化test.a
的其余元素,但我不知道如何解決它。 也許我只需要添加一個構造函數,但我不想更改結構定義(這只是我所面臨的實際問題的一個簡化示例)。
typedef struct inner_t
{
const char* a;
const int b;
const char* c[6];
} inner;
typedef struct outer_t
{
const inner a[10];
} outer;
int main()
{
outer test = {{
{ "hi!", 0, { "1", "2", "3", "4", "5", ""} },
{ "", -1, { "" } }
}};
return 0;
}
我不關心手動初始化的元素之后會發生什么。 我只關心我沒有得到錯誤。
感謝您的任何幫助!
編輯:如果我像這樣添加一個默認構造函數到inner
:
typedef struct inner_t
{
/* previous stuff */
inner_t() : a(""), b(-1) { }
}
然后我得到更多錯誤:
initialization with '{...}' is not allowed for object of type "const inner"
我試過添加不同的構造函數,但無濟於事。 我不明白的是為什么C風格的結構不只是有一個默認的構造函數。
首先,在C ++ 11中,這段代碼應該按原樣編譯。 (在C中,此代碼也將編譯而沒有任何錯誤。)如果出現此錯誤,則必須使用pre-C ++ 11 C ++編譯器。
現在,關於你的聲明:知道為什么你將inner::b
聲明為const
會很有趣。 為什么inner::b
聲明為const
,而不是inner::a
或inner::c
? inner::b
什么特別之處?
關於outer::a
可以問同樣的問題。 為什么你決定將const
直接應用於特定成員outer::a
而不是將整個outer
對象聲明為const
?
如果這不是故意的,那么你可以停止將單個struct成員聲明為const
而只是將整個test
對象聲明為const
:
typedef struct inner_t
{
const char* a;
int b; // <- removed `const` here
const char* c[6];
} inner;
typedef struct outer_t
{
inner a[10]; // <- removed `const` here
} outer;
int main()
{
const outer test = {{ // <- added `const` here
{ "hi!", 0, { "1", "2", "3", "4", "5", ""} },
{ "", -1, { "" } }
}};
return 0;
}
這將在前C ++ 11編譯器中編譯。
但是如果出於某種充分的理由它是故意的,意味着你不想改變你的聲明,並且你想要將類型保持為C風格的聚合(即沒有用戶聲明的構造函數),那么你的選擇僅限於為所有單獨聲明為const
數據字段提供所有初始值設定項。
PS前C ++ 11語言規范中的措辭使原始代碼非法並使我的版本合法可被視為含糊不清和/或有缺陷。 這可能是GCC在-std=c++98
模式下接受原始代碼的原因,但MSVC ++拒絕它。
如果要使用聚合初始化(這是您正在執行的操作),則不能使用任何用戶定義的構造函數。 它必須看起來像普通的C.看初始化器列表在VC10中不起作用
如果你刪除const int b
前面的單詞const
,那么它編譯好(我在VS2008中嘗試過)。
我認為你要做的事情是不可能的,因為將const int b
聲明為struct的成員是一個C ++概念,它要求你在構造函數中初始化b,但如果你使用的話,不允許你有任何構造函數。 aggragate初始化程序。
首先,我想提一下,您可能需要做的就是為'inner'添加一個默認構造函數。 您已經提到過您不想更改結構定義,但我認為您必須這樣做。 但是,我列出了另一種選擇。
你的問題:
'outer'類型包含一個固定大小為10的數組,因此當初始化變量“test”時,它會嘗試使用給定的數據創建10'內部。 看到你沒有給它足夠的,它無論如何都試圖創建它們,但你沒有“內部”類型的默認構造函數,所以它不知道該怎么做。
解決方案:
1)(最簡單)為'inner'創建一個默認構造函數。
2)使用指針或類似std :: vector(c ++)/其他c類的類,使'outer'中的“a”數組成為動態數組。
希望有所幫助。
您不需要將const變量更改為非const,因為const變量可以初始化一次。 原始代碼在我的編譯器(gcc 4.6.3)中使用g ++成功編譯。 並且它在Visual C ++中成功編譯,但將文件擴展名更改為* .c。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.