我正在尝试用 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/