列出具有私有成员的类的初始化
List initialization of classes with private members
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}}};
但是假设我有以下一个简单的类,它有一个私有成员,就像vector一样例如:有限长度列表
class LimitedLengthList
{
LimitedLengthList(int length) : maxLength(length){};
int operator[]
etc etc
private:
int maxLength;
std::vector<int> list;
};
我如何将其暴露给聚合初始化并对其施加诸如max length之类的制裁?是否可以这样做:
LimitedLengthList a(5) = {1, 2, 3};
或:
LimitedLengthList a = {1, {1, 2, 3}};
与std::vector
(参见ctor 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;
};
你可以这样做:
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的初始化列表构造函数
相关文章:
- 为什么在C++中首先初始化成员类
- 是否可以防止省略聚合初始化成员?
- 正在复制具有未初始化成员的结构
- 使用大括号或括号初始化成员变量
- C++结构:强制初始化成员?
- C++中未初始化成员布尔变量的默认值是多少?
- 使用默认值初始化成员引用
- 在构造函数中初始化成员时,是否应该在成员上使用 std::move?
- C++使用 { } 初始化成员变量
- 如何根据构造函数参数使用超类类型初始化成员变量?
- OpenGL C++:VBO 的结构包装器不会初始化成员
- 有没有办法在Brace中初始化成员
- 从现有 istream 或类本身创建的 istream 初始化成员 istream
- 从其后声明的另一个成员数据初始化成员数据是否为未定义行为
- 通常应用方法,使用带有构造函数委托的 SFINAE 通过类模板的构造函数初始化成员
- 如何在嵌套类中初始化成员?C
- 是否可以在构造函数主体中初始化成员变量,而不是初始值设定项列表
- 编译器错误,因为构造函数必须显式初始化成员
- 如何使用成员函数初始化成员函数指针
- C 如何使用隐藏的默认构造函数初始化成员