C++ 回調函數

一:

 //聲明函數指針,定義一個回調函數的模板,在一個頭文件中,比如從common.h
typedef void(*CallbackFun)(int a);

很簡單,一個void類型的函數,入參是一個int型的整數

二:

A 類
A.h

#ifndef A_H
#define A_H
#include "common.h"
// 這個是回調的執行函數 ,在這邊會調用B的方法
class A
{
public:
    A();
    virtual ~A();
    void todo();// 觸發,去做dosomething
    void dosomething();//這是A要做的事
    void registCallback(CallbackFun callback);//B通過這個,把具體要做的事告訴A
private:
    CallbackFun m_Function;
};
#endif // !A_H

A.cpp

A::~A()
{
}

void A::registCallback(CallbackFun callback)
{
    m_Function = callback;
}

void A::dosomething()
{
    m_Function(66);
}

void A::todo()
{
    dosomething();
}

B類
B.h

#ifndef B_H
#define B_H
#include <iostream>
using namespace std;
// 這個是定義回調函數內容(具體實現)的函數
class B
{
public:
    B();
    ~B();
    static void testA(int aa)
    {
        cout << "BBBB:" <<aa<< endl;
    }
};
#endif // !B_H

B.cpp

#include "B.h"
#include <iostream>
#include "A.h"


B::B()
{
    A *a = new A();
    a->registCallback(testA);
    a->todo();
}


B::~B()
{
}

// 主函數,執行
int main()
{
    B b;
    getchar();
}

硬要理解的話:
1.A對B說,我想要做個事,但是這個事的具體內容,我不知道,但是我定義好這個行動的類型了,叫sb計劃(就是定義一個模板typedef void(*CallbackFun)(int a))
2.具體啥時候做呢,在比如說明天下午3點(這裏就是怎麼觸發它,上面就是調用todo()方法))
3.A想讓B來制定活動的內容,你想好了,就打電話告訴我(A留下了它的電話registCallback(CallBack callback))
4.B想好了活動的內容(B中的static void testA(int aa),就是B想的內容),然後通過A留下的電話告訴了它(a->registCallback(testA);)
5.B提醒A時間到了,A去執行了活動(a->todo();觸發執行)。

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