C++初始化匿名结构体

12

我还在学习C++;我的问题是,如果我有一个像这样的结构体:

struct Height
{
    int feet;
    int inches;
};

然后我有几行代码:

Height h = {5, 7};
Person p("John Doe", 42, "Blonde", "Blue", h);

我喜欢使用花括号初始化结构,但我更希望将其放在一行中,作为匿名Height结构。我该如何做到这一点?我的最初的幼稚方法是:

Person p("John Doe", 42, "Blonde", "Blue", Height{5,7});

然而,这并没有起作用。我离正确的方法很远吗?


4
这可能只是一个例子,但最好将“Height”作为单独的“inches”字段存储。当你需要英尺时可以将其转换为英尺;使用单个单位比搞多个单位要容易得多,特别是现在你可能有多个相等但表示不同的值(例如,{2,3}和{1,15})。 - James McNellis
1
C++1x带有统一初始化语法,可以支持类似这样的内容。你的编译器很可能已经支持它了。 - sbi
2
在Person构造函数中,不要使用Height{5,7},而是指定(struct Height){5,7}(如果您是通过引用传递)(或者&(struct Height){5,7}如果您是通过指针传递)。您基本上是将初始化列表转换为所需的类型。这是C99+的功能,但也应该适用于C ++。 - Erhhung
2个回答

17

目前的C++版本中不可能做到,至少从语法层面上看不行。花括号初始化是初始化语法的一部分,不能在其他地方使用。

你可以给 Height 添加一个构造函数:

struct Height
{
    Height(int f, int i) : feet(f), inches(i) { }
    int feet, inches;
};

这使您可以使用:

Person p("John Doe", 42, "Blonde", "Blue", Height(5, 7));

不幸的是,由于Height不再是聚合体,因此您不能再使用大括号初始化方式。 不过构造函数调用的初始化方式同样简单:

Height h(5, 7);

不错。我不知道结构体可以有构造函数/初始化列表。 - dreadwail
11
一个结构体(struct)和一个类(class)的本质是相同的,唯一的区别在于默认情况下,结构体的基类和成员是公共的,而类的基类和成员是私有的。 - James McNellis

4

标准的 C++(C++98、C++03)不支持此功能。

g++ 提供了语言扩展,我记得 C++0x 将会支持它。你需要检查 g++ 语言扩展和/或可能的 C++0x 语法。

对于当前标准的 C++,只需给 Height 实例命名,就像你已经做过的一样,然后使用这个名称。

祝好运!


它是自动提供的,还是您必须定义一个接受initializer_list参数的构造函数? - Ben Voigt
@Ben:不,你不必定义构造函数来获得C++0x语法。很多时候/目标是有一个统一的语法,在几乎所有情况下都能工作。查看由@sbi提供的Wikipedia链接。或者,如果您想获取详细信息,最新的草案可以从C++委员会页面以PDF格式获得。 - Cheers and hth. - Alf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接