我想知道如何描述构造函数的初始化列表,以便定义包含结构 vector 的结构类型的类变量:
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
的构造函数的不同方式.其中一部分似乎带来了上述错误。
最后,我想知道这样的功能是否可以通过这种方式实现。
提前感谢您的帮助和建议。
最佳答案
只需再添加一对大括号就可以了!
Class() : _list( {{{3, 4}}} ) {}
还有:
Class c( {{{2, 4}}} );
大括号括起来的构造通常用于指示数据成员的大括号括起来的初始化或范围内元素的构造。
Value
这里的结构可以简单地通过 {3,4}
初始化因为它有 2 个数据成员,没有其他构造函数。
如果是std::vector
然而,这种类型的结构用于指示将在其结构中存储在 vector 中的元素集。
最后为 List
, 大括号括起来的构造函数只能接受一个 std::vector<Value>
类型的数据为了用它来初始化唯一的数据成员values
, 它本身的类型是 std::vector<Value>
.
这里每个类都需要一个大括号括起来的初始化器。一个用于 Value
, 一个用于 std::vector<Value>
和一个 List
.
如果是Value
大括号内可能只有 2 个数据(最里面的大括号)。但是对于 std::vector<Value>
可以有一个或多个 Value
类型的数据在它的括号内。最后,对于 List,其大括号(最外层大括号)内只能有一个数据。
例如:
Class() : _list( {{{3, 4}, {5, 6}}} ) {}
也可以,结果是放入 2 个 Value
类型的数据在 vector 里面!
同样为了在构造函数中使用成员结构/类首先声明它们:
class Class {
public:
struct Value;
struct List;
Class() : _list( {{{3, 4}}} ) {}
Class(List _l) : _list(_l) {}
struct Value {
int a;
int b;
};
struct List {
std::vector<Value> values;
};
private:
List _list;
};
在比较中,去掉List
的大括号就OK了如果类定义如下:
class Class {
public:
struct Value;
struct List;
Class() : _list( {3, 4} ) {}
Class(List _l) : _list(_l) {}
struct Value {
int a;
int b;
};
struct List {
Value values;
};
private:
List _list;
};
但那是因为 List(还有 Value)没有用户定义的构造函数,而 List 只有一个数据成员!
祝你好运
关于c++ - 在构造函数初始化列表中使用结构 vector 初始化类结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56195246/