面向对象事件响应函数如何处理
实现
事件响应处理类(EvenResponsor)
分析:
EvenResponsor
包括行为action
,对象actor
actor
:采用一个空指针类定义一个对象,这个类指针可以接收多个不同的对象,也成为哑指针。action
:采用一个指针接收成员函数(行为)。这个成员函数可以返回任何类型,这里定义了一个模板EvenAction
。friend bool operator ==(const EvenRespoonsor & ihs,const EvenResponsor & rhs)
:- 判断是否响应的对象一致,可以直接访问作比较
lhs.actor
- 判断是否行为一致,使用二级指针的形式(指向类成员函数指针的指针)。由于成员函数指针并不是普通的指针,首先他有一个指针指向类;其次,再有成员函数在类中描述;总的来说,从实现上并不一定是指针,尺寸是有可能变化的。
- 判断是否响应的对象一致,可以直接访问作比较
事件管理
定义
分析:
- 使用
typedef
定义一个响应者矢量EventResponsors
,用于存储响应者。 - 析构函数:迭代器析构所有对象
为什么使用typename关键字
typedef typename std::vector<T>::size_type size_type;
vector::size_type
,事实上一共有三种可能:
静态数据成员 静态成员函数 嵌套类型
typedef typename
:typedef
创建了存在类型的别名,而typename
告诉编译器std::vector::size_type
是一个类型而不是一个成员。
事件绑定
解除绑定
如何使用-触发者
EventDelegator
:事件委托者类;’value
:新值;tag
:附加的参数
触发值变更处理(重要)
it
:指向响应者的指针,而非对象。*(it->action)
:指向类成员函数的指针- 如果得到
it->actor
上的成员函数的指针,使用->*
得到 - 这样
(it->actor->* ( * (it->action)) )(value,tag)
可调用成员函数
行动者
- 在触发器上侦听事件,
tigger
调用绑定函数,将行动者绑定到值变更的事件上。这样将事件写入到事件触发的列表中。 - 解绑原理同绑定函数
- 值变更,需要将tag转为指针形式。
参考:
1、https://blog.youkuaiyun.com/zhangxiao93/article/details/50569924