我有一个 TileManager 类来管理对象的生命周期,因此对它们持有一个shared_ptr:
class TileManager {
private:
std::vector<std::shared_ptr<const Tile>> tiles;
}
现在我有另一个类 Map ,它拥有对 TileManager 管理的对象的非拥有引用:
class Map {
private:
std::vector<std::weak_ptr<const Tile>> tiles;
}
我的问题是:我不希望 Map 类能够操作指向 Tile 的智能指针。因此,我想在 vector const:
中创建指针class Map {
private:
std::vector<const std::weak_ptr<const Tile>> tiles;
}
不幸的是,无法将const对象放入STL容器中。
有人知道解决方案吗?也许是完全不同的设计?
答案 0 :(得分:3)
vector
中存储的元素不能是const
,因为它们必须是可分配的。 vector
可以以任何可观察的方式“操纵”指针的唯一方法是销毁给定对象的最后weak_ptr
,这将导致相应shared_ptr
的控制块被解除分配(假设没有其他shared_ptr
仍然引用它。)
简而言之,您可以安全地将非const
weak_ptr
存储在矢量中。
答案 1 :(得分:2)
如果可能,您可以使用std::set
。由于从集合中访问数据的唯一方法只提供const引用或const迭代器,因此无法直接操作这些值。
为此,您可以使用
std::set<std::weak_ptr<const Tile>, std::owner_less<std::weak_ptr<const Tile>>>
。
另一种非技术性解决方案是按设计进行,因为它是你班级的私人成员:简单地在你的班级设计中说“不要重置或覆盖弱指针”。