帮助这个设计
Help with this design
现在,在我的游戏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
}
这种设计可以帮助您轻松地打破与容器和所包含元素的关联,而无需通知机制,而是在容器迭代时。
- 需要帮助设置在C++中使用的Potrace
- 在指针的帮助下,文本文件中单词的频率
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 需要帮助将结构数组传递给函数
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 有人可以帮助我处理正则表达式吗?
- C++调用具有 *this 属性的单个帮助程序函数
- C++:需要帮助了解运算符重载错误
- 需要以下代码的帮助,下面的代码有什么问题
- CS1 项目帮助C++
- 用于检查值是否为其任何参数的帮助程序函数
- 需要有关此 if 语句的帮助
- 类型限定宏帮助程序
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- NS3 插槽混淆(需要帮助理解)
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 需要帮助查找内存泄漏
- 有人可以帮助我理解这些参数/参数吗?