7

私はこれをよくします:

class Child{
  Control*parent;
public:
  Child(Control*theParent):parent(theParent){}
 };

class Control{
 Child child;
 void makeChild(){ child=Child(this); }
 //Control() : child(this) { }  //another example
 }

したがって、Control は子を所有して操作しますが、子は親 Control への参照を保持しています。

プログラムの設計パターンなどの一般的なトピックを読むと、このオブジェクトの整理方法は特に推奨されていないようです。childたとえば、親だけが自分で決定する必要があることを親に行わせることで、親を虐待したくないなどのリスクがあることを認識しています。その場合、親の重要なメソッドがプライベートであることを確認することで簡単に防ぐことができます。ただし、親を管理する別のコントローラーがある場合、一部のメソッドはパブリックにする必要があり、実際には他のコントローラーだけがそれらを操作する必要がある場合でも、子もそれらにアクセスできます。

ですから、これがいかに危険であるかがわかります。

しかし、私の質問は、一般的な代替手段は何ですか? 子供を所有するには親が必要ですが、親に時々物事を通知できるようにするためには子供が必要です。上記ではない場合、どのように?

Objective-C には、実際に参照を渡さずに通知を許可する NSNotificationCenter がありますが、これにより組織的な問題が発生しやすくなります (なぜ私の子供はこの通知を送信し、誰がそれを受け取るのでしょうか?)

4

4 に答える 4

3

インターフェイスでそれらを分離できます。

class IListener {
public:
    virtual void notify (int somevalue) = 0;
    ~IListener() {};
}

class Child{
private:
    IListener *listener;
public:
    Child(IListener *theListener):listener(theListener){}
};

class Control: public IListener {
private:
    Child child;
public:
    makeChild(){ child(this) };
    virtual void notify(int someValue) { doSomething(someValue);};
}

(これはオブザーバー パターンの単純なバージョンです。BTW)。

于 2013-04-10T06:45:35.570 に答える
2

オブザーバーパターンを探しているようです。

オブザーバー パターンでは、オブジェクトは従属オブジェクト (別名オブザーバー) のリストを維持し、必要に応じて変更を通知します。あなたの場合、Controlクラスはオブザーバーであり、Childクラスは通知者です。

Boost ライブラリには、これを実装するために使用できるシグナル/スロット メカニズムがあり ます。

SO でこれを使用する例があります: Boost::Signals for C++ Eventing を使用した完全な例

于 2013-04-10T06:43:19.923 に答える
0

リングに別のアイデアを投げかけると、Friend クラスはこれにも大いに役立つように思われます。

子がアクセスできないメソッドは、privateまたは作成されprotectedます。そうすれば、子供はあなたが望まないダメージを与えることができなくなります。

次に、親コントローラーを管理するために別のクラスが必要な場合、親クラスはその他のクラスを作成してfriend、子から差し控えるすべてのプライベートメソッドにアクセスできるようにします。

于 2013-04-10T06:52:50.717 に答える