私有构造函数与STL容器deque

时间:2013-06-07 13:41:53

标签: c++ stl

我有一个使用std :: deque

的类表
class Table {
public:
Table():columns_(10) {};
private:
  std::deque<Column> columns_
}

我希望只有类可以初始化类列,所以我会做类似下面的事情

class Column  {
private:
int a_;
friend class Table;
Column(): a_(1) {};
}

在编译期间,STL容器抱怨Columns类的构造函数是私有的,我理解,但是有另一种方法可以确保只有类Table可以初始化类Column并且仍然能够在STL容器中使用它。

2 个答案:

答案 0 :(得分:4)

在您的特定情况下,只需将以下声明添加到Column

friend class std::deque<Column>;

一般来说,如果你想拥有这样一个模式,你根本无法预先调整容器的大小,你需要逐个添加易于构造的对象。

在支持此功能的容器(例如std::vector)上,您可以使用reserve后跟push_back

答案 1 :(得分:0)

制作std::deque<std::unique_ptr<Column>> columns_并让Table构建列并填充deque

e.g。

class Table 
{
public:
    Table()
        : columns_(10) 
    {};

    void addColumn()
    {
        columns.push_back(std::unique_ptr<Column>(new Column));
    };

private:
    std::deque<std::unique_ptr<Column>> columns_
}