1. 程式人生 > >C++回撥函式的一點理解

C++回撥函式的一點理解

回撥函式是通過函式指標呼叫的函式:把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標被用來呼叫其所指向的函式時,就稱為回撥函式。回撥函式不是由該函式的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行響應。

通俗點說就是:在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;
}