将指针传递给您自己的对象的替代方法

joh*_*ers 7 c++ design-patterns reference

我做了很多:

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

class Control{
 Child child;
 void makeChild(){ child=Child(this); }
 //Control() : child(this) { }  //another example
 }
Run Code Online (Sandbox Code Playgroud)

因此,Control拥有并操作孩子,但孩子仍然引用了父Control.

当我阅读关于程序设计模式等的一般主题时,似乎不特别推荐这种组织对象的方法.我意识到存在风险,例如你不希望你child的父母通过让父母做只有父母应该自己决定做的事情来滥用它的父母; 在这种情况下,通过确保父级的关键方法是私有的,似乎很容易防止.但是你可能有另一个管理父节点的控制器,在这种情况下,一些方法应该是公共的,现在你的孩子也可以访问那些,当真正只有其他控制器应该操纵那些.

所以我可以看出这是多么危险.

但我的问题是,什么是常见的替代方案?您需要父母拥有一个孩子,但您需要孩子能够偶尔通知父母.怎么,如果不是以上?

Objective-C有NSNotificationCenter,它允许通知而不实际传递引用,但这也使得创建组织问题变得容易(为什么我的孩子发出这个通知,谁将收到它?)

Mik*_*kel 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);};
}
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,这是观察者模式的简单版本)。