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大概也就是這樣,但可能會更復雜一點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM