回調函數是透過函數指標調用的函數。若將函數 A 的指標作為參數傳給函數 B,B 內部透過該指標調用 A,即構成回調機制。A 為回調函數,通常在系統滿足特定條件時自動執行。回調能改善軟體結構,提高復用性。
函數指標指向函數而非變數,儲存函數的記憶體位址。C++ 類成員函數因需物件實例調用,不能直接作為普通回調;常見做法是將成員函數設計為 static 靜態成員函數。
#include <iostream>
typedef int(*Fun11)(int, int);
typedef float(*Fun12)(float, float);
int min(int a, int b) { return a < b ? a : b; }
float max(float a, float b) { return a > b ? a : b; }
int test1() {
Fun11 pFun1 = &min;
int ret1 = pFun1(-1, 2);
std::cout << "min callback ret: " << ret1 << std::endl;
Fun12 pFun2 = &max;
float ret2 = pFun2(3.4f, 5.6f);
std::cout << "max callback ret: " << ret2 << std::endl;
return 0;
}
// 類靜態成員函數回調範例
class CallBack {
int a;
typedef void(*Fun2)(void*);
Fun2 m_fptr;
void* m_arg;
public:
CallBack() : a(0) {}
void registerProc(Fun2 fptr, void* arg) { m_fptr = fptr; m_arg = arg; }
void doCallBack() { if (m_fptr) m_fptr(m_arg); }
~CallBack() {}
static void display(void* _this) {
if (!_this) return;
CallBack* pc = (CallBack*)_this;
pc->a++;
std::cout << "a = " << pc->a << std::endl;
}
};
void callback31() {
CallBack cb;
cb.registerProc(CallBack::display, &cb);
cb.doCallBack();
}
int main() {
test1();
callback31();
return 0;
}
typedef 簡化函數指標宣告。this 指標,簽名與普通函數一致,適合作為回調。