如何将const weak_ptr放入STL容器中

时间:2012-10-27 12:45:53

标签: c++ stl c++11 smart-pointers

我有一个 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容器中。

有人知道解决方案吗?也许是完全不同的设计?

2 个答案:

答案 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>>>

另一种非技术性解决方案是按设计进行,因为它是你班级的私人成员:简单地在你的班级设计中说“不要重置或覆盖弱指针”。