zoukankan      html  css  js  c++  java
  • c++回调实现

    回调是A将一个函数指针传给B,然后调用B,B在执行自身函数后,再在合适的时候执行A的这个函数指针,这样就能避免A和B的相互包含和链接,在大型项目中回调是一种打破循环依赖的常用技术。

    typedef void(CALLBACK* MyCallBack)(const char *);
    typedef void(*MyFuncB)(MyCallBack, const char *);
    
    //回调函数
    void CALLBACK FuncC(const char* pszStr)
    {
        std::cout << "FunC is Running" << std::endl;
        if (!pszStr)
        {
            return;
        }
        std::cout << pszStr << std::endl;
    }
    
    //设置回调,并且执行FuncB
    void FuncA(MyFuncB pFunB, MyCallBack pCallBAck, const char * pszStr)
    {
        std::cout << "FunA is Running" << std::endl;
        if (pCallBAck && pFunB)
        {
            pFunB(pCallBAck, pszStr);
        }
    }
    
    void FunB(MyCallBack pCallBAck, const char * pszStr)
    {
        std::cout << "FunB is Running" << std::endl;
        if (pCallBAck)
        {
            pCallBAck(pszStr);
        }
    }
    
    void FuncD(void)
    {
        std::cout << "FunD is Running" << std::endl;
    }
    
    class  CTestA
    {
    public:
        void SetCallBack(MyCallBack pCallBack,const char* pszStr)
        {
            std::cout << "SetCallBack" << std::endl;
            if (pCallBack && pszStr)
            {
                m_pCallBack = pCallBack;
                m_pszStr = (char*)pszStr;
            }
            DoCallBack();
        }
    
        void DoCallBack()
        {
            std::cout << "DoCallBack Running" << std::endl;
            if (m_pCallBack)
            {
                m_pCallBack(m_pszStr);
            }
        }
    
    private:
        MyCallBack m_pCallBack;
        char* m_pszStr;
    };
    
    class CTestB
    {
    public:
        void static CALLBACK FuncCallBack(const char* pszStr)//非 static比较麻烦
        {
            if (pszStr)
            {
                std::cout << pszStr << std::endl;
            }
             
        }
    };
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        FuncA(FunB, FuncC,"hello");
        FuncD();
    
        CTestA a;
        a.SetCallBack(CTestB::FuncCallBack, "hello");
    
        return 0;
    }

    boost::bind也能实现类似功能

  • 相关阅读:
    Elasticsearch排序与相关性
    Elasticsearch请求体查询
    编码问题
    Mybatis
    Spring Framework
    线上的一些坑记录
    【小程序】---- 实现授权与登录的基本流程
    【小程序】---- 封装请求
    【小程序】---- 自定义数字键盘拨号
    不为人知的网络编程(十二):彻底搞懂TCP协议层的KeepAlive保活机制
  • 原文地址:https://www.cnblogs.com/ultracpp/p/4149990.html
Copyright © 2011-2022 走看看