close

 
 
        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");
}

 

 

 

 

arrow
arrow
    創作者介紹
    創作者 Eric 的頭像
    Eric

    一個小小工程師的心情抒發天地

    Eric 發表在 痞客邦 留言(4) 人氣()