11

クラス階層内の複数のクラス間でオブジェクトのインスタンスを共有するための良い方法は何ですか?私は次の状況にあります:

class texture_manager;

class world {
    ...
    std::vector<object> objects_;
    skybox skybox_;
}

私は現在、texture_managerをシングルトンとして実装しており、クライアントはコード内のどこからでもそのインスタンス化メソッドを呼び出します。ベクトル内のs 、によって、そして場合によってはクラスの一部である場合もそうでない場合もある他のクラスによってtexture_managerも使用される必要があります。コードでのシングルトンの使用を制限しようとしているので、このアプローチの代替案をお勧めしますか?頭に浮かんだ解決策の1つは、参照を引数として、それにアクセスする必要のあるすべてのクラスのコンストラクターに渡すことです。ありがとう。objectobjects_skybox_worldtexture_manager

4

1 に答える 1

11

その質問に対する一般的な答えは、を使用すること::std::shared_ptrです。または、それがない場合、、またはない::std::tr1::shared_ptr場合は、::boost::shared_ptr

あなたの特定のケースでは、私はいくつかの異なるアプローチの1つをお勧めします:

  1. もちろん、1つの可能性はshared_ptrアプローチです。基本的に、オブジェクトを必要とするすべての人にポインタを渡し、オブジェクトが不要になると自動的に破棄されます。テクスチャマネージャがそれを指すオブジェクトへのポインタで終わる場合でも、参照サイクルを作成しているので、それは非常に注意深く処理する必要があります。

  2. もう1つの可能性は、それをローカル変数として宣言し、それmainを必要とするすべての人へのポインターまたは参照として渡すことです。プログラムがそのように終了するまでそれは消えません、そしてあなたは生涯を管理することについて心配する必要はありません。この場合、ベアポインタまたは参照で問題ありません。

  3. 3番目の可能性は、シングルトンのようなものの漠然と受け入れられる使用法の1つです。そして、これは詳細な説明に値します。

あなたは、物事への有用なポインタを配ることが唯一の仕事であるシングルトンを作ります。それが持っている重要な機能は、ポインタを渡すものを指示する機能です。これは、グローバルに構成可能なファクトリのようなものです。

これにより、一般的にシングルトンで作成する巨大なテストの問題から逃れることができます。テストするときは、スタブオブジェクトへのポインタを渡すように指示するだけです。

また、同じ理由でシングルトンが表すアクセス制御/セキュリティの問題(はい、セキュリティの問題も発生します)から逃れることができます。実行しようとしているコードのセクションがアクセスする必要のないものへのアクセスを許可しないオブジェクトへのポインターを渡すように一時的に指示することができます。この考え方は、一般的に最小権限の原則と呼ばれます。

これを使用する主な理由は、ポインターが必要な人を見つけて、ポインターを渡すという問題を回避できることです。これは、スルーがあなたにとって良いことだと考えて、それを使用しない主な理由でもあります。また、テクスチャマネージャへの同じポインタを取得することを期待していた2つのものが、予期していなかった制御フローのために、実際には異なるテクスチャマネージャへのポインタを取得する可能性を紹介します。これは、基本的に、あなたを引き起こしたずさんな思考の結果です。そもそもシングルトンを使うこと。最後に、シングルトンは非常にひどいので、このより良性の使用でさえ私をかゆくさせます。


個人的には、あなたの場合、アプローチ#2をお勧めします。スタック上に作成し、main必要な場所へのポインターを渡すだけです。それはあなたにあなたのプログラムの構造についてより注意深く考えさせるでしょう、そしてこの種のオブジェクトはおそらくあなたのプログラムの生涯を通して生きているはずです。

于 2011-11-19T22:28:25.697 に答える