VC++實現CallBack

原文鏈接:https://blog.csdn.net/lincyang/article/details/29175413

一、函數指針


那麼什麼是函數指針呢?說白了就是指向函數的指針,它是一個變量。

通常,函數會被編譯爲一段二進制機器碼。每個函數總是佔用一段連續的內存區,而函數名就是該函數所佔內存區的首地址。

可以把函數的這個首地址(入口地址)賦予一個指針變量,使該指針變量指向該函數。

那麼就可以通過該指針變量就可以找到並且調用這個函數了。

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章