廢話不多說,上代碼:
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大概也就是這樣,但可能會更復雜一點。