2011-11-19 22 views
9

クラス階層内の複数のクラス間でオブジェクトのインスタンスを共有する良い方法はありますか?私は、次のような状況があります。私は現在、シングルトンとしてtexture_manager実装クラス間でオブジェクトを共有する良い方法は何ですか?

class texture_manager; 

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

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

+1

texture_managerのグローバルインスタンスを宣言するだけではどうですか?グローバルが正しく処理されていれば、グローバルは邪悪ではありません。そして、それらは、他のインスタンスが複数のクライアントに渡って渡されるよりも、スレッド環境であまり危険ではない... – Mordachai

答えて

10

この質問に対する一般的な回答は::std::shared_ptrです。または、それがない場合、::std::tr1::shared_ptr、またはそれがない場合は::boost::shared_ptrです。あなたの特定のケースで

、私はいくつかの異なるアプローチの1をお勧めします:

  1. 一つの可能​​性は、当然のことながら、shared_ptrのアプローチです。基本的には、オブジェクトを必要とするすべての人にポインタを渡します。そして、それが必要なくなったときに自動的に破棄されます。あなたのテクスチャマネージャがそれを指し示すオブジェクトへのポインタで終わるつもりなら、あなたはリファレンスサイクルを作成しています。それは非常に慎重に扱わなければなりません。

  2. もう一つの可能​​性は、それをローカル変数としてmainに宣言して、それを必要とするすべての人へのポインタまたは参照として渡すことです。あなたのプログラムがそのように終わるまで、それは遠ざかることはありません。あなたは寿命を管理することについて心配する必要はありません。この場合、裸のポインタやリファレンスはうまくいきます。

  3. 3つ目の可能性は、シングルトンのようなものを漠然として受け入れられる用途の1つです。そして、これは詳細な説明が必要です。

あなただけの仕事をしている人は、物事に役に立つポインタを渡すことです。それが持っている主な機能は、ポインタを何に渡すべきかを伝える能力です。これは、グローバルに設定可能な工場のようなものです。

これにより、一般的なシングルトンで作成した巨大なテストの問題から脱出することができます。テストするときにスタブオブジェクトへのポインタを渡すように伝えてください。

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

これを使用する主な理由は、ポインタを必要としている人を見つけ出し、それをそれらに渡すという問題を軽減できるからです。これは、それを使わない主な理由でもあります。また、あなたが予想しなかったコントロールフローのために、同じポインタをテクスチャマネージャに渡すことを期待していた2つのものが実際に異なるテクスチャマネージャへのポインタを得る可能性を紹介します。これは基本的に、最初にシングルトンを使うこと。最後に、シングルトンはとてもひどいので、これをもっとうまく使ってもかゆくなります。


個人的に、あなたのケースでは、私はちょうどmainでスタック上に作成し、それが必要なのどこにポインタを渡し、アプローチ#2をお勧めします。それはあなたのプログラムの構造についてもっと慎重に考えるようになります。そして、この種のオブジェクトはおそらくあなたのプログラム全体の生涯にわたって生きるはずです。

+2

ここで共有ポインタのいくつかの並べ替えを使用すると、ちょっとした(しかし重要な)誰が実際に 'texture_manager'オブジェクトを所有しているかについての議論。誰もそれを参照しなくなるとすぐに本当に破壊されるべきですか? –

+1

私はそれについて考えましたが、shared_ptrをクラス階層の下に通すのは面倒なようです。代わりの解決策を見つけることを望んでいます。それともあなたが念頭に置いていたことではないのですか? –

+0

@FrerichRaabe:ええ、私はちょうど '標準的なアドバイス'の最初のカットとしてそれを入れました。それはすぐに私が考えた問題です。しかし、私はもう少し深くそれを分析し、私の答えを更新しました。 – Omnifarious

関連する問題