我创建了一个shared_ptr
类向量的向量(_cells
(。
class Goban
{
public:
Goban();
~Goban();
private:
vector<vector<shared_ptr<Cell>>> _cells;
};
我这样初始化:
Goban::Goban() : _cells(18, vector<shared_ptr<Cell>>(18, make_shared<Cell>()))
{
}
问题是所有指针都动态地引用同一个指针(如果我理解正确的话(。因此,当我使用向量更改类Cell中的一个元素时,它会更改所有其他元素。
问题是所有指针都动态引用同一指针
这是因为您使用了向量的构造函数,该构造函数生成值参数的N个副本。共享指针的副本指向共享对象。
我想要单独的指针
然后不要使用向量的构造函数。您可以编写一个循环,调用make_shared
来创建每个元素,并为每个向量重复一个循环。
要获得18x18个不同的shared_ptr
s,初始化_cells
的正确方法可能是:
Goban::Goban() : _cells(18, std::vector<std::shared_ptr<Cell>>(18))) {
for (auto& cs : _cells)
for (auto& c : cs)
c = std::make_shared<Cell>();
}
或
Goban::Goban() : _cells(18) {
for (auto& cs : _cells) {
cs.resize(18);
for (auto& c : cs)
c = std::make_shared<Cell>();
}
}
只需在构造函数体中而不是在初始化器列表中显式初始化向量。
Goban::Goban()
{
for (int i = 0 ; i < 18; i++) {
_cells.push_back(make_shared<Cell>());
}
}