回调函数在C/C++中的使用
生活随笔
收集整理的這篇文章主要介紹了
回调函数在C/C++中的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
回調函數就是一個通過函數指針調用的函數。假如把A函數的指針當作參數傳給B函數,然后在B函數中通過A函數傳進來的這個指針調用A函數,那么就是回調機制。A函數就是回調函數,而通常情況下,A函數是在系統符合你設定的條件下自動執行。
???????? 使用回調函數可以改善軟件的結構,提供軟件的復用性。
???????? 函數指針是一個指針,只是這個指針不像普通的指針指向一個變量,此時它指向的是一個函數,也就是它存儲的是一個函數的指針。
???????? C++的類成員函數不能像普通函數那樣用于回調,因為每個成員函數都需要有一個對象實例去調用它。通常情況下,要實現成員函數作為回調函數,一種常用的方法就是把該成員函數設計為靜態成員函數。
#include <iostream>typedef int(*Fun11)(int, int);
typedef float(*Fun12)(float, float);int min(int a, int b)
{return a < b ? a : b;;
}float max(float a, float b)
{return a > b ? a : b;
}int test1()
{Fun11 pFun1 = NULL;pFun1 = &min;int ret1 = pFun1(-1, 2);std::cout<<"min value is: "<<ret1<<std::endl;Fun12 pFun2 = NULL;pFun2 = &max;float ret2 = pFun2(3.4, -2.2);std::cout<<"max value is: "<<ret2<<std::endl;return 0;
}typedef void(*Fun2)(void*);class CallBack;
class CallBackTest;class CallBackTest {
public:CallBackTest() {}~CallBackTest() {}void registerProc(Fun2 fptr, void* arg = NULL){m_fptr = fptr;if (arg != NULL) {m_arg = arg;}}void doCallBack(){m_fptr(m_arg);}private:Fun2 m_fptr;void* m_arg;
};class CallBack {
public:CallBack(CallBackTest* t) : a(2){if (t) {t->registerProc((Fun2)display, this);}}~CallBack() {}static void display(void* _this = NULL){if (!_this) {return;}CallBack* pc = (CallBack*)_this;pc->a++;std::cout<<"a is "<<pc->a<<std::endl;}private:int a;
};int test2()
{//http://www.360doc.com/content/14/0825/13/15077656_404487615.shtmlCallBackTest* cbt = new CallBackTest();CallBack* cb = new CallBack(cbt);cbt->doCallBack();return 0;
}void callback31()
{ std::cout<<"this a callback function 31"<<std::endl;
} int callback32(int num)
{ std::cout<<"this input param value is: "<<num<<std::endl;return 0;
}void Caller31(void (*ptr)())
{ (*ptr)();
}void Caller32(int n, int (*ptr)(int))
{(*ptr)(n);
}int test3()
{ Caller31(callback31); Caller32(32, callback32);return 0;
} int main()
{test1();test2();test3();return 0;
}
總結
以上是生活随笔為你收集整理的回调函数在C/C++中的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++各种数据类型转换汇总
- 下一篇: Caffe基础介绍