帮助这个设计

Help with this design

本文关键字:帮助      更新时间:2023-10-16

现在,在我的游戏gui API中,我有一个mousellistener。

这只是一个带有方法的抽象类。现在,它的用法如下:

假设我想要一个Widget来接受鼠标监听器:

我创建了一个鼠标侦听器向量,并提供了添加和删除函数来删除侦听器。每当事件发生时,该Widget将调用所有鼠标侦听器的方法(例如:mouse down)。

另一方面,您将有一个实现mousellistener方法的类。

我对这个系统的唯一问题是,如果Listener被销毁,它没有办法通知所有它正在监听的东西。

所以我想要一个系统,如果任何一端被破坏,它们都得到通知并相互删除,就像它们从未被添加一样。

我还想这样做,以便每个侦听器(例如:mousellistener)都继承自Listener,以便任何人都可以轻松地创建更精细的侦听器类。

任何关于设计这样的东西的想法将不胜感激。由于

一个设计,是非boost,非c++0x,非自动垃圾收集,非智能指针....

听众正在听的东西(从现在起称为发声器)如何了解听众?它们存储一个指针,对吧?

如果是这样的话,我建议给发声者一个指向听者的弱指针。一旦侦听器破坏,弱指针将不再有效,因此当发声器试图通知侦听器时,它将看到这一点,并可以从要通知的对象列表中删除该指针。

同样的事情也可以用另一种方式完成(侦听器可以存储指向发声器的弱指针,尽管我不明白为什么需要这样做)。

您可以实现自己的弱指针和强指针,或者您可以使用c++0x标准库(gcc和vc++10提供)中的指针

您会考虑使用现有的东西,如Boost Signals2或Qt吗?

当关联的任何一端都可以被销毁时,可以使用boost::weak_ptr。在您的示例中,小部件将具有weak_ptrs向量,并且每个侦听器将作为boost::shared_ptr创建。当对vector进行迭代时,您将尝试将weak_ptr锁定为shared_ptr,并在它未被销毁时使用它。下面是boost页面中显示将weak_ptr转换为shared_ptr的示例

shared_ptr<int> p(new int(5));
weak_ptr<int> q(p);
// some time later
if(shared_ptr<int> r = q.lock())
{
    // use *r
}

这种设计可以帮助您轻松地打破与容器和所包含元素的关联,而无需通知机制,而是在容器迭代时。