[英]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.