我有一个类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的智能指针。因此,我想使向量内部的指针const:
class Map {
private:
std::vector<const std::weak_ptr<const Tile>> tiles;
}
不幸的是,不可能将const对象放入STL容器中。
有人知道解决方案吗?也许是完全不同的设计?
存储在vector
中的元素不能是const
,因为它们必须是可赋值的。vector
能够以任何可观察的方式"操纵"指针的唯一方法是破坏到给定对象的最后一个weak_ptr
,这将导致对应shared_ptr
的控制块被释放(假设没有其他shared_ptr
仍然引用它)。
简而言之,您可以安全地将非const
的weak_ptr
存储在向量中。
如果可能,您可以使用std::set
。由于从集合访问数据的唯一方法只提供常量引用或常量迭代器,因此无法直接操作这些值。
要做到这一点,你可以使用
CCD_ 10。
另一种非技术性的解决方案是通过设计来实现,因为它可能是你的类的私人成员:只需在你的类设计中说"不要重置或覆盖弱指针"。