1

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

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

4

2 回答 2

3

存储在 a 中的元素vector不能是const因为它们必须是可分配的。vector可以以任何可观察的方式“操纵”指针的唯一方法是销毁weak_ptr给定对象的最后一个,这将导致相应对象的控制块shared_ptr被释放(假设没有其他shared_ptr仍然引用它) .

简而言之,您可以安全地将 non- 存储const weak_ptr在向量中。

于 2012-10-27T12:55:14.893 回答
2

如果可能,您可以使用std::set. 由于从集合中访问数据的唯一方法仅提供 const 引用或 const 迭代器,因此您不能直接操作这些值。

为此,您将使用

std::set<std::weak_ptr<const Tile>, std::owner_less<std::weak_ptr<const Tile>>>.

另一种非技术解决方案是通过设计来实现,因为它可能是您的类的私有成员:只需在您的类设计中说“不要重置或覆盖弱指针”。

于 2012-10-27T12:51:55.690 回答