0

これは、C++ の観点から見た一般的な設計上の問題です。他の 2 つのクラスのオブジェクトを含むコンテナー クラスがあります。

コンテナー クラスから、「含まれているクラス オブジェクトへのハンドルがあるため」、含まれているクラス オブジェクトのメソッドを呼び出すことができます。

しかし、含まれているクラス オブジェクト (objContainedClass1) がコンテナー クラスのメソッドにアクセスする方法を知りたいです。

次の方法が考えられます。

  1. コンテナー クラス オブジェクトは、それ自体へのポインター (このポインター) を、含まれているクラス コンストラクターに渡します。このポインターを使用して、含まれるクラスはコンテナー クラスのメソッドにアクセスできます。

  2. コンテナー クラスの一部の関数を静的にします。

これを達成するためのアイデアは他にありますか?

ありがとう

4

5 に答える 5

7

しないでください。通常、クラスがそのコンテナについて知る必要があるのは設計が悪いです。通常、それは単一責任の原則を破ったことを意味します。

于 2010-09-14T13:58:47.530 に答える
2

目的が異なる場合は、どちらの方法でも問題ありません。静的メソッドを呼び出すだけであれば、#2 で問題ありません。ただし、コンテナクラスのインスタンスメソッドにアクセスする必要がある場合は、コンテナクラスのポインタが必要なので、#1 の方法です。

一般的なソリューションが必要な場合は、オブザーバー パターンを実装します。この場合、含まれるクラスはコンテナーについて何も認識せず、必要に応じてイベントを発生させるだけです。

于 2010-09-14T14:01:13.947 に答える
1

いくつかの悪いオプションがあります。

コンテナー クラスの外部で使用されていない場合は、含まれているクラスをコンテナー クラスの一部にすることができます。

コンテナーを、含まれているクラスのフレンドにすることができます (yuck)。

生のポインターの代わりに、参照または boost::shared_ptr をコンテナーに渡すことができます。最適な方法は、それぞれの寿命によって異なります。可能であれば、生のポインターは避けてください。

私が実際にやろうとしているのは、含まれているオブジェクトが使用する必要があるコンテナー メソッドのインターフェイス ( など) を分離し、IContainerCallbackそれを 2 つの間のリンクとして使用することです。したがって、含まれるオブジェクトは、コンテナの実装から切り離されたインターフェイス クラスを介して、間接的にのみコンテナを参照します。

于 2010-09-14T14:02:43.117 に答える
0
  • コンテナー クラスの一部の関数を静的にします。

それは「さようならOOP!」と呼べるものです。可能な限り使用を控えております。

  • コンテナー クラス オブジェクトは、それ自体へのポインター (このポインター) を、含まれているクラス コンストラクターに渡します。このポインターを使用して、含まれるクラスはコンテナー クラスのメソッドにアクセスできます。

包含クラスがインターフェースを実装し、包含クラスがインターフェースしか認識していない場合、個人的には問題はないと思います。実際、それは私自身がしていることです。明らかに、アプローチの落とし穴に注意する必要があります。たとえば、含まれているオブジェクトがコンテナーの破棄中にコンテナーのメソッドを呼び出す場合 (または、コンテナーが中間状態にあるその他の瞬間) です。

含まれているものを含まれているクラスからさらに分離するには、イベントまたはメッセージも使用できます。収容されたオブジェクトは、どこに収容されているかを知りませんが、代わりにメッセージを送信します。包含オブジェクトを作成するとき、包含オブジェクトはそれらからのメッセージの受信者として自身を登録します。この手法により、オブジェクトを文字通り独立させることができますが、(1) 何らかのメッセージング フレームワークが必要であり、(2) C++ の静的な性質のために実装が複雑であり、(3) クラスのインターフェイスにメッセージングが含まれるようになったため、追加レベルのドキュメントも必要です。

それ以外の場合は、含まれているオブジェクトがコンテナーのメソッドを呼び出す必要がある理由をよく考えてください。コンテナからいくつかの一般的な機能を第 3 クラスに分割する必要があるのでしょうか? 含まれているオブジェクトが実際にアクティブなオブジェクトであり、システム内のイベントの論理ソースである場合、コンテナーが含まれているオブジェクトの状態変化を効率的にポーリング/監視できるようにするために、基本的なイベント/メッセージング システムが本当に必要になる場合があります。

于 2010-09-14T14:29:47.193 に答える
-1

しないでください。コンテナー クラスの責任は、物を格納することだけです。コンテナー クラスが内容に基づいてアクションを実行する必要がある場合は、3 番目のオブジェクトにそれらのアクションを実行させます。たとえば、クラスの内容に基づいて、クラスのコレクションを再配置または変更していると想定しています。含まれているクラス内で実行しようとする代わりに、コンテナーを依存関係として使用するクラスでこのアクションを実行してください。

于 2010-09-16T14:46:07.870 に答える