c++ 不破坏类封装的回调函数构思

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

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

        在一次偶然的机会下,看到了一种方法可以简单的实现回调非静态成员函数,其原理就是把要调用该成员函数的对象实例赋值给一个变量,然后通过该变量来调用成员函数。把逻辑整理了一下,然后写了一个简单的回调代理类,通过这个类,可以简单的实现非静态函数的回调。

代码:
#ifndef CCALLBACKPROXY_H
#define CCALLBACKPROXY_H
 
 
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;    //调用对象
};
 
 
#if 1
//设置调用对象及其回调函数
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
 
 
 
 
 
 
#endif // CCALLBACKPROXY_H
///non cpp file

///main.cpp
#include <QCoreApplication>
#include "ccallbackproxy.h"
class CTest
{
public:
    CTest(int nNum)
    {
        m_nSum = 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值