CallBack Function
前言: 會想寫這一篇的主要原因是因為人老了怕健忘,而且網路上的版本似乎都是一樣的,所以才想寫一個淺顯易懂的來幫助有需要的人來理解這東西。
定義:
何謂callback function ? 我們把它拆開來講, function 是一種動態被call的東西,打個比方:
void add ()
{
//do something ;
}
int main()
{
int n = add () ; --> 這樣就叫動態
}
那callback function 呢? 它屬於靜態的,舉例:
有A 和 B兩個人,
A告訴B : 欸欸欸 假如有人找我,你就打"1234"這個分機給我
然後A和B就繼續幹自己原本的事情了,
等到"突然"有人跟B說,欸,A在哪裡?
那麼B就會"打1234"這個"分機"跟A說 : 欸,有人找你
範例裡面的 "1234" 我們可以想像成是A在的地方,也就是A的地址,疑,這樣講有沒有覺得突然有fu了?
沒錯,我們可以把這個1234想像成是pointer 。
A告訴B,A的address在哪,B知道後,可以先不理它,等到"突然" 這裡。
"突然" 是一個事件,一個event,這個事件發生的原因不定時,當有這個event發生的時候,B才需要透過"1234"這個分機號碼,告訴A有人要找你。
這樣的解釋,如果還不懂,麻煩自己在重念一次-___-。
接下來,我們開始用程式來說話吧
在學習callback function之前,咱們先來學習使用"函數指標"(function pointer),為什麼? 因為你要先學習如何將你的分機給B,而這個動作,就是指我們要將function pointer給B。
在這邊,我提供兩種sample給大家看 :
Sample 1 .
執行結果:
Sample 2 .
我先假設你指標已經學熟了,在這裡我就先不談pointer,這個改天有機會我再寫,講回剛剛的callback function ,還記得上面的定義嗎 ?
我們把上面的定義,順序寫出來
1. 首先,我們要有兩個人 ( A和B )
2. 第二,B需要知道A的地址 (1234)
3. 等待event (當有人找A)
4. 呼叫A (打電話給A)
/*******************************************************/
Source code
/*******************************************************/
#include <iostream>
using namespace std;
typedef void (*CALLBACK) (void*);
typedef struct _tagObject
{
CALLBACK cb;
}obj;
void FunA (void*);
void FunB (void*);
void FunA(void *pParam)
{
char *str = (char*)pParam;
printf("Here is Func 'A' \n");
}
void FunB(void *pParam)
{
char *str = (char*)pParam;
printf("Here is Func 'B' \n");
}
void RegisterCallBackFunction (obj *pObj , CALLBACK cb)
{
pObj->cb = cb ;
printf ("pObj->cb:0x%x \n" , pObj->cb);
}
void ObjectCall(obj*pObj)
{
pObj->cb ("Eric Callback Function Test \n");
}
int main()
{
//1.首先,我們有兩個人 (A先生 , B先生)
obj objA, objB ;
//2.我們註冊電話號碼
RegisterCallBackFunction(&objA,FunA);
RegisterCallBackFunction(&objB,FunB);
//3.我們選擇要撥號給誰
int sel;
do
{
printf("Please Enter an integer to Call your friend (1-2) \n");
cin>> sel; //看要找誰
switch (sel)
{
case 1:
ObjectCall(&objA) ; //4.我們要找A先生
break;
case 2:
ObjectCall(&objB) ; //4.我們要找B先生
break;
default:
printf("查無此人\n");
break;
}
} while (sel<3);
printf("Bye\n");
}
留言列表