【问题标题】:List initialization of classes with private members列出具有私有成员的类的初始化
【发布时间】:2014-07-15 07:14:53
【问题描述】:

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}};

【问题讨论】:

  • vector 的初始化不是聚合初始化。它是列表初始化,使用带有 std::initializer_list 的构造函数。
  • @T.C.就是这样,知道这会让我的研究更容易。

标签: c++ c++11


【解决方案1】:

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;  
};

【讨论】:

    【解决方案2】:

    你可以这样做:

    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} 部分使用向量的初始化列表构造函数。

    【讨论】:

    • 我会按值而不是按 const ref 采用 v,然后采用 list(std::move(v))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多