c++中怎么自定义事件监听(回调函数)
废话不多说,上代码:
#include <iostream>
#include <vector>
using namespace std;
class A
{
private:
int a = 5;
vector<void(*)(int)> funcs;
public:
void setA(int a_);
void registerCallback(void(*p)(int));
};
void display(int a)
{
cout << "a=" << a << endl;
}
int main()
{
A a1;
a1.registerCallback(display);
a1.setA(7);
system("pause");
return 0;
}
void A::setA(int a_)
{
a = a_;
for (int i = 0; i < funcs.size(); ++i) {
funcs[i](a);
}
}
void A::registerCallback(void(*p)(int))
{
funcs.push_back(p);
}
运行结果:
这里用到了函数指针(即指向函数的指针),我们要监听A类中的成员变量a,我们定义A类的时候就增加一个将来要监听a变量的函数指针列表,并增加一个registerCallback函数用于将来添加监听者,在a变化时将监听者列表里的所有监听者都调用一遍;在使用A类对象时,我们只要把一个返回类型、参数列表(签名)符合的函数添加为回调函数即可,如上面当我们运行a1.setA(7)改变a的值时,就会调用了回调函数display,这就差不多是事件监听的思想:首先订阅事件(如这里的把display函数注册为回调函数),然后当事件(这里是a的值变化了)发生时,就会自动调用回调函数实现监听。c#里的delegation和java里的listener大概也就是这样,但可能会更复杂一点。