C++實現非靜態成員函數作為回調函數
2015/10/04 13:07
瀏覽135
迴響0
推薦0
引用0
眾所周知,C++的類成員函數不能像普通函數那樣用於回調,因為每個成員函數都需要有一個對象實例去調用它。
通常情況下,要實現成員函數作為回調函數,一種常用的方法就是把該成員函數設計為靜態成員函數,但這樣做有一個缺點,就是會破壞類的結構性,因為靜態成員 函數只能訪問該類的靜態成員變量和靜態成員函數,不能訪問非靜態的,要解決這個問題,需要把對象實例的指針或引用做為參數傳給它。
在一次偶然的機會下,看到了一種方法可以簡單的實現回調非靜態成員函數,其原理就是把要調用該成員函數的對象實例賦值給一個變量,然後通過該變量來調用成 員函數。把邏輯整理了一下,然後寫了一個簡單的回調代理類,通過這個類,可以簡單的實現非靜態函數的回調。
CallbackProxy.h
#ifndef __CALLBACK_PROXY_H__
#define __CALLBACK_PROXY_H__
//Tobject:調用對象的類型,Tparam回調函數參數的類型
template<typename Tobject, typename Tparam>
class CCallbackProxy
{
typedef void (Tobject::*CbFun)(Tparam*);
public:
void Set(Tobject *pInstance, CbFun pFun);
bool Exec(Tparam* pParam);
private:
CbFun pCbFun; //回調函數指針
Tobject* m_pInstance; //調用對象
};
//設置調用對象及其回調函數
template<typename Tobject, typename Tparam>
void CCallbackProxy<Tobject, Tparam>::Set(Tobject *pInstance , CbFun pFun)
{
m_pInstance = pInstance;
pCbFun = pFun;
};
//調用回調函數
template<typename Tobject, typename Tparam>
bool CCallbackProxy<Tobject, Tparam>::Exec(Tparam* pParam)
{
(m_pInstance->*pCbFun)(pParam);
return true;
}
#endif
下面演示下如何使用該類
test.cpp
#include "CallbackProxy.h"
class CTest
{
public:
CTest(int nNum);
void CbPrintSum(int *pnAddNum){printf("The Sum is %d\n", m_nSum+*pnAddNum);};
private:
int m_nSum;
};
int main(int argc, char* argv[])
{
CCallbackProxy<CTest, int> CbProxy;
CTest TestInstance(20);
CbProxy.Set(&TestInstance, &CTest::CbPrintSum);
int nNum = 1000;
CbProxy.Exec(&nNum);
return 0;
}
CTest::CTest(int nNum):
m_nSum(nNum)
{
你可能會有興趣的文章:
限會員,要發表迴響,請先登入


