gpt4 book ai didi

c++ - 将指向你自己的指针传递给你拥有的对象的替代方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:13 26 4
gpt4 key购买 nike

我经常这样做:

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

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

因此控件拥有并操作子控件,但子控件仍然引用父控件。

当我阅读有关程序设计模式等的一般主题时,似乎并不特别推荐这种组织对象的方法。我意识到存在风险,例如,您不希望您的 child 滥用其父级,让其父级执行只有父级才应自行决定执行的操作;在这种情况下,通过确保父级的关键方法是私有(private)的,似乎很容易防止。但是你可能有另一个管理父级的 Controller ,在这种情况下,一些方法应该是公共(public)的,现在你的 child 也可以访问这些方法,而实际上只有其他一些 Controller 应该操纵这些方法。

所以我可以看出这有多危险。

但我的问题是,什么是常见的替代方案?您需要 parent 拥有 child ,但您需要 child 能够偶尔将事情通知 parent 。 如果不是上面的怎么办?

Objective-C 有 NSNotificationCenter 允许通知而不实际传递引用,但这也很容易产生组织问题(为什么我的 child 发送这个通知,谁会收到它?)

最佳答案

您可以通过接口(interface)将它们分开:

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);};
}

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

关于c++ - 将指向你自己的指针传递给你拥有的对象的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15918620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com