列出具有私有成员的类的初始化

List initialization of classes with private members

本文关键字:初始化 成员      更新时间:2023-10-16

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的初始化列表构造函数