c++中怎么自定义事件监听(回调函数)

废话不多说,上代码:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 class A 
 5 {
 6 private:
 7     int a = 5;
 8     vector<void(*)(int)> funcs;
 9 public:
10     void setA(int a_);
11     void registerCallback(void(*p)(int));
12 };
13 
14 void display(int a) 
15 {
16     cout << "a=" << a << endl;
17 }
18 
19 int main()
20 {
21     A a1;
22     a1.registerCallback(display);
23     a1.setA(7);
24     system("pause");
25     return 0;
26 }
27 
28 void A::setA(int a_)
29 {
30     a = a_;
31     for (int i = 0; i < funcs.size(); ++i) {
32         funcs[i](a);
33     }
34 }
35 
36 void A::registerCallback(void(*p)(int))
37 {
38     funcs.push_back(p);
39 }

运行结果:

这里用到了函数指针(即指向函数的指针),我们要监听A类中的成员变量a,我们定义A类的时候就增加一个将来要监听a变量的函数指针列表,并增加一个registerCallback函数用于将来添加监听者,在a变化时将监听者列表里的所有监听者都调用一遍;在使用A类对象时,我们只要把一个返回类型、参数列表(签名)符合的函数添加为回调函数即可,如上面当我们运行a1.setA(7)改变a的值时,就会调用了回调函数display,这就差不多是事件监听的思想:首先订阅事件(如这里的把display函数注册为回调函数),然后当事件(这里是a的值变化了)发生时,就会自动调用回调函数实现监听。c#里的delegation和java里的listener大概也就是这样,但可能会更复杂一点。

posted @ 2018-09-18 13:54  life_limbo  阅读(6167)  评论(5编辑  收藏  举报