標籤:c++ 回呼函數
要注意C ++ 的類的成員函數和一般的C 函數的區別。C + + 類採用this 規則傳遞函數。在使用類的成員函數作為回呼函數,要求該成員函數被聲名為靜態成員函數,並且注意函數聲名的時候要同時聲明好參數路由規則。
簡單的樣本:
CallBackClass.h
#ifndef CALL_BACK_CLASS_H#define CALL_BACK_CLASS_Hclass CallBack{public: CallBack(){} ~CallBack(){} typedef void(*call_back_func)(int);//先聲明函數指標,即我們要調用的函數public: /*安裝函數指標*/ void call_back( void(*call_back_func)(int),int n ){ call_back_func(n); }};#endif
這裡聲明及定義寫在了一起是為了方便。
main.cpp
#include <iostream>#include "CallBackClass.h"using namespace std;void func(int n){ //該函數需為全域,或類中的靜態函數 cout<<n<<endl;}int main(){ CallBack a; a.call_back_func(func,10);}
我們調用對象a的成員函數call_back_func,該函數參數為一個函數指標及一個整型。傳入函數名即將該函數地址傳入,使其調用了func函數。
CallBackTest.h
#ifndef CALL_BACK_TEST_H#define CALL_BACK_TEST_Hclass CallBackTest{public: CallBackTest(){}; ~CallBackTest(){}; typedef void(*call_back_func)(void*,int);public: /*綁定對象*/ void call_back(void* pThisObject,void(*call_back_func)(void*,int),int n){ my_Object = pThisObject; my_func = call_back_func; my_n = n; } void exec_back_func(){ my_func(my_Object,my_n);//這裡將綁定到我們的靜態函數 }private: call_back_func my_func; int my_n; void* my_Object;};#endif
main.cpp
#include <iostream>#include "CallBackTest.h"using namespace std;class Proxy{public: static void need_call_func(void* pCurObject,int n){ Proxy* pObject = (Proxy*)pCurObject; pObject->execFunc(n); } void Exec(){ CallBackTest callback; callback.call_back(this,need_call_func,10); callback.enec_back_func(); } void execFunc(int n){ cout<<n<<endl; }};int main(){ Proxy test; test.Exec(); return 0;}
我們都知道,類的靜態函數由該類的執行個體共用。
而這裡的疑惑點在於,靜態函數的安裝。
1、callback.call_back(this,need_call_func,10);確認某個對象的參數
2、callback.exec_back_func();將我們的參數安裝到靜態函數
3、執行靜態函數內容。
其實描述得不是很好,請各位試著自己理解。
對該程式還不是很清楚的 可通過調試才瞭解程式的執行。
c++ 在類中寫回呼函數