1

オブジェクトの有効期間を管理するクラスTileManagerがあるため、オブジェクトに shared_ptr を保持します。

class TileManager {
private:
    std::vector<std::shared_ptr<const Tile>> tiles;
}

これで、 TileManagerによって管理されるオブジェクトへの非所有参照を保持する別のクラスMapができました。

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

に格納された要素は、代入可能でなければならないため、 にするvectorことはできませんconstvector監視可能な方法でポインターを「操作」できる唯一の方法はweak_ptr、特定のオブジェクトの最後のオブジェクトを破棄することです。これにより、対応する の制御ブロックが割り当て解除されます (まだそれを参照しているshared_ptrが他にないと仮定します)。 shared_ptr.

要するに、非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>>>.

もう1つの非技術的な解決策は、おそらくあなたのクラスのプライベートメンバーであるため、設計によって行うことです。クラス設計で「弱いポインターをリセットまたは上書きしないでください」と言うだけです。

于 2012-10-27T12:51:55.690 に答える