废话不多说,上代码:
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大概也就是这样,但可能会更复杂一点。