• 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也能实现类似功能

  • 相关阅读:
    CentOS yum 源的配置与使用
    CentOS 添加常用 yum 源
    给centOs添加epel源
    centos 推荐使用epel源
    如何在CentOS 5/6上安装EPEL 源
    为centos添加第三方源
    Linux远程桌面工具 -- NoMachine
    Redis windows版本的启停bat脚本命令
    Elasticsearch+Hbase实现海量数据秒回查询
    mysql 与elasticsearch实时同步常用插件及优缺点对比(ES与关系型数据库同步)
  • 原文地址:https://www.cnblogs.com/ultracpp/p/4149990.html
Copyright © 2020-2023  润新知