一、函數指針
那麼什麼是函數指針呢?說白了就是指向函數的指針,它是一個變量。
通常,函數會被編譯爲一段二進制機器碼。每個函數總是佔用一段連續的內存區,而函數名就是該函數所佔內存區的首地址。
可以把函數的這個首地址(入口地址)賦予一個指針變量,使該指針變量指向該函數。
那麼就可以通過該指針變量就可以找到並且調用這個函數了。
int (*p)();//聲明一個指向返回值是整型的函數指針
void (*pf)();//聲明一個指向返回值是void的函數指針
二、函數指針實現回調
簡單的用法如下:
int add(int a,int b) {
return a+b;
}
int main() {
int i;
int (*pf)();
pf = add;
i = (*pf)(2,3);
printf("the result is %d\n",i);
return 0;
}
三、VC++中的DEMO
在用MFC開發界面程序時會遇到邏輯層會發送動態信息給UI層更新界面的情況。下面我們用回調函數來完成這個需求。
下面的例子用Color類和Dlg類做演示,當顏色變化時更新界面信息。
Color類:
#pragma once
#include <string>
using namespace::std;
typedef void (* COLOR_CALL_BACK)(string color);//函數指針
class Color
{
public:
Color();
~Color();
void RegisterColorCallback(COLOR_CALL_BACK callback)//註冊特洛伊木馬的地方
{
ColorListener = callback;//將要回調的函數首地址賦值給你的指針變量
}
public:
void SetColor(string color)
ColorListener(color);//當顏色有變化時調用回調通知界面
private:
COLOR_CALL_BACK ColorListener;//我們的指針變量
};
Dlg類:
static void ListenColor(string color);
Color mColor;
mColor.RegisterColorCallback(ListenColor);
四、靜態函數調用類成員方法
由於回調函數必須是類靜態方法,所以當我使用的時候需要調用類成員方法。發現這樣做不可以。
思來想去,由於我這個界面類是類似於單例,所以用類靜態指針來完成這個任務。
static CCallBackDlg *pThis;
CCallBackDlg *CCallBackDlg::pThis;
void CCallBackDlg::ListenColor(string color)
{
pThis->ChangeColor(color);
}