是否可以在C++中初始化结构,如下所示
struct address {
int street_no;
char *street_name;
char *city;
char *prov;
char *postal_code;
};
address temp_address =
{ .city = "Hamilton", .prov = "Ontario" };
Run Code Online (Sandbox Code Playgroud)
这里和这里的链接提到可以仅在C中使用此样式.如果是这样,为什么在C++中这是不可能的?是否有任何潜在的技术原因导致它没有在C++中实现,或者使用这种风格是不好的做法.我喜欢使用这种初始化方式,因为我的结构很大,这种风格让我清楚地看到了为哪个成员分配了什么值.
如果有其他方法可以达到相同的可读性,请与我分享.
在发布此问题之前,我已经提到了以下链接
Wyz*_*a-- 153
如果你想清楚每个初始化器的值是什么,只需将它分成多行,并对每个行进行注释:
address temp_addres = {
0, // street_no
nullptr, // street_name
"Hamilton", // city
"Ontario", // prov
nullptr, // postal_code
};
Run Code Online (Sandbox Code Playgroud)
Gui*_*i13 94
在我的问题导致没有令人满意的结果后(因为C++没有为结构实现基于标记的init),我采用了我在这里找到的技巧:默认情况下,C++结构的成员是否初始化为0?
对你来说,这相当于:
address temp_address = {}; // will zero all fields in C++
temp_address.city = "Hamilton";
temp_address.prov = "Ontario";
Run Code Online (Sandbox Code Playgroud)
这肯定是最接近你想要的(除了你想要初始化的那些之外的所有字段都是零).
Gen*_*ene 15
字段标识符确实是C初始化语法.在C++中,只需在没有字段名称的情况下以正确的顺序给出值.不幸的是,这意味着你需要全部给它们(实际上你可以省略尾随的零值字段,结果将是相同的):
address temp_address = { 0, 0, "Hamilton", "Ontario", 0 };
Run Code Online (Sandbox Code Playgroud)
小智 12
此功能称为指定的初始化程序.它是C99标准的补充.但是,这个功能被排除在C++ 11之外.根据The C++ Programming Language,第4版,第44.3.3.2节(C++未采用的C特性):
在C++中故意不采用C99(与C89相比)的一些补充:
[1]可变长度阵列(VLA); 使用矢量或某种形式的动态数组
[2]指定的初始化器; 使用构造函数
C99语法具有指定的初始化程序 [参见ISO/IEC 9899:2011,N1570委员会草案 - 2011年4月12日]
6.7.9初始化
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designation_opt initializer
initializer-list , designationopt initializer
designation:
designator-list =
designator-list:
designator
designator-list designator
designator:
[ constant-expression ]
. identifier
Run Code Online (Sandbox Code Playgroud)
另一方面,C++ 11没有指定的初始化程序 [参见ISO/IEC 14882:2011,N3690委员会草案 - 2013年5月15日]
8.5初始化器
initializer:
brace-or-equal-initializer
( expression-list )
brace-or-equal-initializer:
= initializer-clause
braced-init-list
initializer-clause:
assignment-expression
braced-init-list
initializer-list:
initializer-clause ...opt
initializer-list , initializer-clause ...opt
braced-init-list:
{ initializer-list ,opt }
{ }
Run Code Online (Sandbox Code Playgroud)
为了达到相同的效果,请使用构造函数或初始化列表:
我可能在这里遗漏了一些东西,为什么不:
#include <cstdio>
struct Group {
int x;
int y;
const char* s;
};
int main()
{
Group group {
.x = 1,
.y = 2,
.s = "Hello it works"
};
printf("%d, %d, %s", group.x, group.y, group.s);
}
Run Code Online (Sandbox Code Playgroud)
你可以通过ctor初始化:
struct address {
address() : city("Hamilton"), prov("Ontario") {}
int street_no;
char *street_name;
char *city;
char *prov;
char *postal_code;
};
Run Code Online (Sandbox Code Playgroud)
您甚至可以将Gui13的解决方案打包到单个初始化语句中:
struct address {
int street_no;
char *street_name;
char *city;
char *prov;
char *postal_code;
};
address ta = (ta = address(), ta.city = "Hamilton", ta.prov = "Ontario", ta);
Run Code Online (Sandbox Code Playgroud)
免责声明:我不推荐这种风格
我知道这个问题已经很老了,但我找到了另一种初始化方法,使用constexpr和currying:
struct mp_struct_t {
public:
constexpr mp_struct_t(int member1) : mp_struct_t(member1, 0, 0) {}
constexpr mp_struct_t(int member1, int member2, int member3) : member1(member1), member2(member2), member3(member3) {}
constexpr mp_struct_t another_member(int member) { return {member1, member, member2}; }
constexpr mp_struct_t yet_another_one(int member) { return {member1, member2, member}; }
int member1, member2, member3;
};
static mp_struct_t a_struct = mp_struct_t{1}
.another_member(2)
.yet_another_one(3);
Run Code Online (Sandbox Code Playgroud)
此方法也适用于全局静态变量甚至constexpr变量.唯一的缺点是可维护性差:每次使用此方法必须初始化另一个成员时,必须更改所有成员初始化方法.
它没有在C++中实现.(还有,char*字符串?我希望不是).
通常,如果你有这么多参数,那就是相当严重的代码味道.但相反,为什么不简单地初始化结构然后分配每个成员?
| 归档时间: |
|
| 查看次数: |
436915 次 |
| 最近记录: |