众所周知,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)
-
{
-
-
}
阅读(2711) | 评论(0) | 转发(0) |