一:
//聲明函數指針,定義一個回調函數的模板,在一個頭文件中,比如從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();觸發執行)。