2011-03-08 7 views
2

私のプロジェクトでは、特定の理由により、マネージャクラスによってインスタンスが管理される一連のクラスがあります。C++:クラスクラスマネージャの関係についてわからない

例は次のようになります

Csoundファイル - 単一音声

CSoundManagerを抽象化 - Csoundファイルの友人、 は Csoundファイルインスタンスを作成するためのファクトリメソッドを提供するには、一緒に

をアクティブ音声をミックス

また、CFont、CFontManager(名前ごとのフォントアクセス用)、CSprite、CSpriteManager(各フレームの描画用)など。すでに

ここに私の最初の質問:

  • が、私はデザインパターンという名前の特定をやっていますか?
  • ほとんどの場合、何らかの理由で悪い考えですか?はいの場合、なぜですか?

その後、私は自分自身を求めている:

  • オブジェクトが作成および破棄すべきか? newで、または対応するマネージャークラスのメソッドによってのみ、スタック上に作成することができますか?

(破壊のためにも:。delete myFont;FontManager.DestroyFont(myFont);

+2

クラス名の先頭に「C」を付けないでください。 Yuk。 –

+3

もっと良い質問は「すべてがCで始まるのはなぜですか?名前空間とは対照的に、多くのプロジェクトでこれが行われています。私が考えることができる最大の例はUnreal Engineで、これは(ほぼ)すべてに「Un」を付加しています。しかし、これは、いくつかのクラス名を大声で 'UnFortunateConsequences'を読み込むようにします... – James

+0

Microsoftは、MFCクラスについても同じことをします。彼らはまた、たとえば、CFontクラスを持っています。これはあなた自身のクラスでCを使用しない理由の一つです! –

答えて

0

あなたは工場のデザインパターンのいくつかのフォームを使用しているように見えます。何があなたに悪い考えを感じさせるか分かりません。

Managerをオブジェクトのコンテナとして扱う場合、これらのオブジェクトのライフサイクルを制御します。しかし、あなたのオブジェクトがマネージャの生活を超えて生きなければならない場合は、新しいものでそれらを作成し、マネージャは破壊の責任を負いません。

1

あなたはThe Single Responsibility Principle (SRP)の原則に違反している可能性があります。

CSoundオブジェクトのライフタイムの作成と管理は、CSoundManagerクラスが担当していますか、またはアクティブなサウンドを混在させることを担当していますか?名前は多くを伝えることができ、「マネージャ」はあまりにも多くの方法で理解することができます...

一般的に、これらのマネージャクラスでオブジェクトのライフタイムを処理する場合は、これらのオブジェクト(つまり、オブジェクト内のプライベートctor)をインスタンス化します。実装は少し異なりますが、Factory Design Patternを参照してください。

newまたはdeleteとする必要があります。 deleteを手動で呼び出すとバグが発生しやすくなり、RAIIなどのイディオムを使用しないでください。この特定のケースでは、Managerクラスはオブジェクトのライフタイムを管理する必要があるため、deleteはクライアントコードには表示されません。

0

一般的に実装しているのは、オブジェクトが別のオブジェクトを割り当てるファクトリメソッドパターンです。しかしファクトリクラスの利点は、ファクトリが抽象的なすべての内部を管理できるようにするのではなく、割り当てられた型をファクトリに直接結びつけるためです。たとえば、任意のファイルか、そのリソースタイプ(CSoundManager)のファクトリからのみこれを行うことができます:new CSound();

もしそうなら、あなたはポイントを逃していて、基本的にはオブジェクトを割り当てて管理するシングルトンしか持っていません。リソースタイプを抽象化することを検討してください。 CSoundとCFontがIResourceから派生している場合、そのタイプの列挙型や何らかの識別子を取り、コードベースの結合と依存関係を減らすCResourceManagerを持つことができます。そのオブジェクトを使用する必要があるときはいつでも型を公開することができますが、一般的なインタフェース(Update()、Create()、Destroy()などを使用して抽象マネージャ(CResourceManager) 。

サウンドマネージャの場合、サウンドは一度読み込むだけで済み、一意の状態でインスタンス化することができます。そのような場合は、リソースマネージャが実際のリソース(CSound)を管理し、サウンドマネージャ(CSoundManager)が離散インスタンス(CSoundInstanceなど)を管理し、CSoundMixerを使用して混合を管理します。複雑さを管理し、冗長性を減らす意味のある方法でクラスを特化します。

私はサウンドマネージャを例として使用しましたが、これはほとんどのioシステム(グラフィック、入力、物理)に当てはまります。

関連する問題