C++回撥函式的一點理解
阿新 • • 發佈:2019-02-12
回撥函式是通過函式指標呼叫的函式:把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標被用來呼叫其所指向的函式時,就稱為回撥函式。回撥函式不是由該函式的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行響應。
通俗點說就是:在A類中呼叫B類中的某個方法C,然後B類反過來呼叫A類中的方法D,則D就是回撥函式。
打個比方:
我們將A類看成一個人,就叫他小A;將B類也看成一個人,就叫他小B;
那麼使用回撥函式D的過程就可以這樣理解:
小A在開發過程中遇到了一個麻煩,而這個麻煩只有小B才能解決,於是小A找到了小B求他幫忙,但是由於和小B不怎麼熟悉於是帶上了名片。小A向小B說明了遇到的麻煩後,正巧小B正在忙於其他事情,於是小B先收下了小A的名片,告訴小A回去等訊息。由於這個麻煩不解決就無法繼續開發,於是回去等訊息的小A就只好先去做別的事情。過了一段時間小B忙完手上的事情,解決了小A的麻煩後,找出小A名片上的電話號碼撥了過去,告訴小A,麻煩已經搞定了(小B只是順著名片把解決方案告訴給小A,而並不關心自己給出的解決方案在小A那裡會如何運用)。小A放下電話後,利用小B給他的解決方案繼續開發。
簡而言之:小A帶著名片D通過途徑C找到小B求他幫忙,小B不能立即解決於是收下名片D,之後的某天小B解決了小A的問題後又通過名片D告訴了小A解決方法。
即:
A類呼叫B類中的C方法,D作為函式指標當做C方法的一個引數(小A帶著名片D通過途徑C找到小B求他幫忙)
B類無法立即處理,就先進行回撥函式標記(收下名片)
在未來的某一個時間點,當滿足觸發條件時(解決問題後)
通過回撥函式D傳遞迴資訊給A類(通過名片告訴結果)
下面以一個例子說明上述過程(解釋見註釋):
#include <iostream> typedef void (*Fun)(int);//定義一個函式指標型別 Fun p = NULL;//用Fun定義一個變數p,它指向一個返回值為空引數為int的函式 void caller(Fun pCallback) { p = pCallback; //達成某一條件後,通過名片(函式指標p),傳回結果 int result = 1; (*p)(result); } void callback(int a)//回撥函式 { std::cout << "callback result = " << a << std::endl; } int main(int argc, char* argv[]) { caller(callback); getchar(); return 0; }