Callback Function

  • 1439
  • 0

Callback Function

C++ 的 callback funcation 筆記記錄:

callback 給我的感覺上像是定義了一個介面, 再由其他人(也就是使用的人)去實做這個介面.

這麼說好了,假設A是一個負責接收資料的類別,但是接收完資料後呢?該怎麼處理資料就不是A所該負責的(因為他只負責接受)。是要由使用A這個接收資料的人來做決定該如何處理,那問題來了,當A接收到資料後,要怎麼去通知使用A的人呢? 這時候就可以藉由 callback 來達到這樣的目的。

B君: 叫A進來
A君:我進來了.
B君:A君, 你開始接收資料
(此時B君就離開了)
(當A君接收到資料後…)
A君:執行接收到資料的方法(此方法是由B君時做出來的)

情況大致上就像這樣!!若以程式碼來表示:

A君的內容:

   1: #pragma once
   2: #include <string>
   3:  
   4: typedef void(*ReceivedDataMethod)(std::string);
   5:  
   6: class A君
   7: {
   8: public:
   9:     A君(ReceivedDataMethod func){
  10:         this->gotMessageFunc = func;
  11:     }
  12:  
  13:     ~A君(void){
  14:         this->gotMessageFunc = NULL;
  15:     }
  16:     
  17:     // 假設 A 君收到資料後會自己呼叫這個 ReceiveMessage method.
  18:     // 不過,這個 method 實際上的執行內容不是A君所建立的
  19:     // 是再新增A君時由外部所給予的
  20:     void ReceiveMessage(std::string message){
  21:         gotMessageFunc(message);
  22:     }
  23:  
  24: private:
  25:     ReceivedDataMethod gotMessageFunc;
  26: };
  27:  

使用A君:

   1: #include <Windows.h>
   2: #include <iostream>
   3: #include "A君.h"
   4:  
   5: // implement
   6: void OnReceived(std::string message){
   7:     std::cout << "You got message " << message << std::endl;
   8: }
   9:  
  10: //func: callback method
  11: void noRepeat(display_func func){
  12:   func(100);    // 調用 callback
  13: }
  14:  
  15: int main(int argc, char* argv[]){
  16:     // OnReceived 正好是實做A君的 ReceivedDataMethod
  17:     A君 myClass(OnReceived); 
  18:     // 當A君呼叫 RecevieMessage 時,實際上就是執行 OnReceived 這個 Method
  19:     myClass.ReceiveMessage("Start!!");
  20:  
  21:     getchar();
  22:     return 0;
  23: }