gpt4 book ai didi

c++ - C++中的对象事件通信

转载 作者:行者123 更新时间:2023-11-28 07:27:00 24 4
gpt4 key购买 nike

enter image description here

我必须设计一个实用程序类,使不同对象之间能够进行事件通信。每个类都应该派生自 util 以使用它提供的框架。在图中,限制就像是任何 B 发布的内容都只有 A 和 C 可以接收,而 X 和 Y 不能。它应该被限制在一个组或一个层中。当 X 仅发布 B 而 y 可以接收时。但是在发布时,发布者不应该知道它正在发布给谁,订阅者也是如此。它不应该知道它从谁那里订阅。使用通用的发布者和订阅者方法,我可以将事件发送给订阅它的任何人,但我不能将其限制在一个组内。这里有两组,如 A-B-C 和 B-X-Y。同样,无论应该对实用程序进行什么更改,都不应更改除实用程序之外的所有对象实现的业务逻辑。

对 util 类中的逻辑有什么建议吗?

最佳答案

看起来您的愿望是允许每个类的实例与它们派生的类以及它们的所有兄弟(派生自其父类的类)进行 pub/sub 通信。

这是一个非常特殊的要求,特殊要求通常需要有趣的解决方案。

一种解决方案是为每个父类创建一个发布/子类。每个类都将自己与其父类和自己的类相关联(以便它可以分别与其 sibling 和所有后代进行通信)。

template <typename T>
struct PubSubSingleston
{
static PubSubManager instance;
}

template <typename T>
PubSubManager PubSubSingleton<T>::instance;

然后,类可以将自己与那些发布-订阅“层”相关联。最干净的方法可能是多重继承,如果你支持的话

template <typename ClassT, typename ParentT>
class PubSubHelper
{
public:
PubSubHelper()
{
PubSubSingleton<ClassT>::instance.associate(this);
PubSubSingleton<ParrentT>::instance.associate(this);
}

void publish(const Message& inMessage)
{
PubSubSingleton<ClassT>::instance.publish(inMessage);
}
};

class X
: public B
, PubSubHelper<X, B>
{ ... }

还有许多其他模式(如 CRTP)与此相关,但基本技术是将一个类与与其自身相关联的一些 PubSub 对象相关联,并将另一个与它的父级相关联。

关于c++ - C++中的对象事件通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18586444/

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