回調函數引意
假設有AB兩個類,B類是我們自己寫的應用類,A類為第三方類相機類,如下!

在設計A類的時候,該類的設計者肯定想把相機采集到的圖片實時傳遞給應用者(此時是我們B類),而我們B類在設計應用程序的時候也想實時獲取到相機采集到的圖片,那B類中該怎么做呢?第一想到的方法就
是一直死循環輪詢A類對象調用相關成員函數獲取到實時圖像。這種方式無疑不造成一種資源的浪費,而且占用很大的CPU資源。
那么有沒有一種方式,當只有A類采集到圖像的時候才去通知B類去獲取圖像這樣的方式呢?答案是有的,這就引出我們今天討論的主題:回調函數!
回調函數主要過程就是:把B類的函數注冊(傳遞函數指針)給 A類,當A類采集到圖像,就調用剛注冊進來的B類函數,這樣就間接完成了,由A類去通知B類去做某事


由以上圖可知,把B類的函數注冊給了A類。
知道了回調函數的用意,接下來就是編寫代碼演示過程
此次演示,我們使用c++11標准來編寫代碼
代碼演示
#include <iostream>
#include <functional>
using namespace std;
/*回調函數原型聲明*/
typedef function<void(int)> CALLBACK;
/*相機SDK底層A類*/
class A_Camera
{
public:
void regeditCallBack(CALLBACK fun)/*注冊回調函數*/
{
_fun = fun;
}
void getFrame()/*內部獲取圖像函數(B類調用者不需要關心它什么時候會執行)*/
{
/*采集到一幀數據_frame*/
/****內部操作***/
/***內部操作***/
_frame = rand() % 10;
_fun(_frame);/*回傳給B_My類*/
}
private:
int _frame;
CALLBACK _fun;
};
/*應用層B類*/
class B_My
{
public:
void callBackFun(int frame)/*獲取到A類的圖像,此時frame就是一幀數據*/
{
cout << "B類獲取到一幀數據:" << frame << endl;
}
};
int main(int argc, char **argv)
{
/*聲明應用層B類對象*/
B_My B;
auto Fun = bind(&B_My::callBackFun, B, placeholders::_1);/*中轉一下,利用C++11特性*/
/*聲明底層相機A類*/
A_Camera camera;
camera.regeditCallBack(Fun);/*把B類的方法注冊給A類*/
/*以下只是模擬A類內部觸發獲取到圖片,一共模擬觸發10次*/
for (int i = 0; i < 10; ++i)
{
camera.getFrame();
}
return 0;
}
運行結果

總結
通過相機回調的方式,簡單的對回調函數進行一次分析,第一次接觸時回調函數機制會有點困難,但多看幾遍心里就會有點感覺。例子涉及到c++11方面的知識,可以暫時忽略,不影響對回調函數的理解
