程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++回調實現,回調實現

c++回調實現,回調實現

編輯:C++入門知識

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也能實現類似功能

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved