std::vector
允许列表初始化,如下所示:
std::vector a = {1, 2, 3, 4};
据我所知,std::vector
的基础成员是私有的,您可以像a.data()
那样访问数据数组,但实际成员是private
。如果我错了,请纠正。
那我怎么能用我自己的班级来模仿呢?我知道,如果你的会员是公开的,你可以这样做:
class A
{
public:
std::vector<int> a;
std::map<int, int> b;
};
A a = {{1, 2, 3, 4}, {{1, 2}, {3, 4}}};
但是我说以下是一个简单的类,它有一个私有成员,就像一个向量说例如:有限长度列表
class LimitedLengthList
{
LimitedLengthList(int length) : maxLength(length){};
int operator[]
etc etc
private:
int maxLength;
std::vector<int> list;
};
如何将此公开给聚合初始化并对其施加最大长度等制裁?有可能做这样的事情:
LimitedLengthList a(5) = {1, 2, 3};
或者这个:
LimitedLengthList a = {1, {1, 2, 3}};
答案 0 :(得分:5)
与std::vector
一样(请参阅第7章),您需要提供一个带std::initializer_list
的构造函数。
像
这样的东西class LimitedLengthList
{
public:
LimitedLengthList(std::initializer_list<T> init, int length = somedefaultval)
: maxLength(length), list(std::move(init)) {}
LimitedLengthList(int length) : maxLength(length){};
int operator[]
etc etc
private:
int maxLength;
std::vector<int> list;
};
答案 1 :(得分:3)
您可以这样做:
LimitedLengthList(int length, std::vector<int> v) :
maxLength(length),
list(std::move(v))
{
if (list.size() >= maxLength) {
throw runtime_error("Bad size");
}
}
所以LimitedLengthList a = {1, {0, 1, 2}};
将采用此构造函数
并使用{0, 1, 2}
部分的vector的初始化列表构造函数。