我有一个使用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容器中使用它。
答案 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_
}