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