c++ - 用 C++ 编写一个简单的事件调度程序——如何避免自引用和递归问题?

标签 c++ events event-handling

我正在尝试用 C++ 编写一个简单的事件调度程序。我对这个特定领域很陌生,所以请原谅我的无知。

对于调度过程,我有以下接口(interface):

class listener
{
    public:
       virtual void triggerEvent(int id)=0;
};

然后合并它,我简单地实现它:

class A : public listener
{
    public:
           A();
           void triggerEvent(int event);
           .
           .
           .
           B* b;
};

在一个类中有一个名为 listener_ 的监听器指针指向一个 A 对象,A 中的事件可以如图所示被触发,

 void B::method()
 {
       .
       .
       .
       listener_->triggerEvent(DO_SOMETHING); // calling point
 }

但现在的问题是,A 也有一个指向 B 对象的指针,这样当调用 A 的 triggerEvent 实现时,B::method() 会再次被调用,即:

 void A::triggerEvent(int id)
 {
      if(id==DO_SOMETHING)b->method();
 }

这会导致递归问题。

理想情况下,我希望 B::method() 中的“调用点”立即从堆栈中释放。我该怎么做才能防止上述递归问题?我的事件调度程序设计有什么不正确之处?我该如何解决?

编辑:上面显示的是一个非常极端的例子。在真实情况下,A 可能实际上是某个“控制线程”。 B 然后可能是一个单独的算法,需要在完成时向控制线程指示,以便 A 可以继续进行进一步的操作。 B::method 也可能是一个线程。

感谢和祝福

本。

最佳答案

您正在实现观察者模式

What is incorrect about my event dispatcher design?

事实上,您在事件处理程序中调用触发事件的方法。您可以通过不调用该方法来修复它。

关于c++ - 用 C++ 编写一个简单的事件调度程序——如何避免自引用和递归问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10716845/

相关文章:

c++ - 比较两种声明数组的方式

c++ - 如何计算没有正确数字的数字的数字

c++ - for 循环中的奇怪行为 - 一个错误?

events - Go lang 测试事件监听器?

c# - 关联控件 C# 的简便方法

javascript - 在 JavaScript 事件处理程序中处理对象函数

c++ - 我如何实例化几个集合对象来测试我的集合类的各种构造函数和方法?

c# - 形成 KeyUp 和 KeyDown 事件来改变变量

vb.net - 将事件与共享潜艇一起使用?

javascript - 当其中一个模型发生更改时,如何为 Backbone.js 中的 Collection View 附加事件处理程序?