我想知道如何描述一个构造函数的初始化列表,以便定义一个包含struct向量的struct类型的类变量:
class Class {
public:
Class() : _list( {{3, 4}} ) {}
Class(List _l) : _list(_l) {}
struct Value {
int a;
int b;
};
struct List {
vector<Value> values;
};
private:
List _list;
}
int main() {
Class c( {{2, 4}} );
}
让我们假设某种向后兼容性可能会带来这种方法的一些好处。
由于仅使用默认构造函数的代码Class() : _list( {{3, 4}} ) {}
似乎没有错误地进行编译,因此附加Class(List _l : _list(_l)
构造函数会带来:
error: expected ')' before '_values'|
和带有对象定义的代码将返回:
error: no matching function for call to 'Class::Class(<brace-enclosed initializer list>, <brace-enclosed initializer list>)'|
。
我尝试了几种解决方法,例如初始化列表的几种不同定义,在构造函数中传递参数的不同方式或定义struct List
的构造函数。其中一部分似乎带来了上述错误。
最后,我想知道是否可以通过这种方式实现这种功能。
首先感谢您的帮助和建议。
答案 0 :(得分:1)
只需再添加一对括号,就可以了!
Class():_list({{{3,4}}}){}
还有:
Class c({{{2,4}}});
大括号括起来的结构通常用于指示范围内元素的数据成员或构造的大括号括起来的初始化。
此处的 Value
结构可以简单地通过 {3,4}
初始化,因为它具有2个数据成员,没有其他构造函数。
在 std :: vector
的情况下,这种类型的构造用于指示要在其构造中存储在向量中的元素集。
最后,对于 List
,用括号括起来的构造函数只能获取类型为 std :: vector
的一个数据,以便使用它来初始化唯一的数据成员< code> values ,其本身的类型为 std :: vector
。
这里每个类都需要一个用括号括起来的初始化程序。一种用于 Value
,一种用于 std :: vector
,另一种用于 List
。
如果使用 Value
,则括号内(最里面的括号)可能只有2个数据。但是对于 std :: vector
,在其大括号内可以存在一个或多个 Value
类型的数据。最后,对于List,在其大括号内(最外面的大括号)中只能有一个数据。
例如:
Class():_list({{{3,4},{5,6}}}){}
也可以,并且将两个类型为 Value
的数据放入向量中!
还为了在构造函数中使用成员结构/类,首先声明它们:
class Class {
上市:
结构值
结构列表;
Class():_list({{{3,4}}}){}
类别(清单_l):_list(_l){}
结构值{
诠释
int b;
};
结构清单{
std :: vector 值;
};
私人的:
清单_list;
};
在比较中,可以删除 List
的花括号,如果该类的定义如下:
class Class {
上市:
结构值
结构列表;
Class():_list({3,4}){}
类别(清单_l):_list(_l){}
结构值{
诠释
int b;
};
结构清单{
值值;
};
私人的:
清单_list;
};
但这是因为List(还有Value)没有用户定义的构造函数,而List仅具有一个数据成员!
祝你好运