• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2013-08-28)  C++ |   2 条评论  4 
    文章评分 0 次,平均分 0.0

    众所周知,C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它,主要原因是类的成员函数都隐含了一个this指针。

    通常情况下,要实现成员函数作为回调函数,一种常用的方法就是把该成员函数设计为静态成员函数,但这样做有一个缺点,就是会破坏类的结构性,因为静态成员函数只能访问该类的静态成员变量和静态成员函数,不能访问非静态的,要解决这个问题,需要把对象实例的指针或引用做为参数传给它。

    最近看到了一种方法可以简单的实现回调非静态成员函数,其原理就是把要调用该成员函数的对象实例赋值给一个变量,然后通过该变量来调用成员函数。把逻辑整理了一下,然后写了一个简单的回调代理类,通过这个类,可以简单的实现非静态函数的回调。
    另外只演示了只有一个参数的例子,多参数可以仿照扩增。

    #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  

    下面演示下如何使用该类

    #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)  { }  
     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/1847.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享