C++ 实现把非静态成员函数作为回调函数(非static)_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > C++ 实现把非静态成员函数作为回调函数(非static)

C++ 实现把非静态成员函数作为回调函数(非static)

 2012/12/16 17:23:55  qimo601  程序员俱乐部  我要评论(0)
  • 摘要:众所周知,C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它。通常情况下,要实现成员函数作为回调函数,一种常用的方法就是把该成员函数设计为静态成员函数,但这样做有一个缺点,就是会破坏类的结构性,因为静态成员函数只能访问该类的静态成员变量和静态成员函数,不能访问非静态的,要解决这个问题,需要把对象实例的指针或引用做为参数传给它。在一次偶然的机会下,看到了一种方法可以简单的实现回调非静态成员函数,其原理就是把要调用该成员函数的对象实例赋值给一个变量
  • 标签:实现 函数 c++
众所周知,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)  
{  
  
}  
?
发表评论
用户名: 匿名