1.回調函數的說明:
在進行軟件開發的過程當中,常會用到一些聲明爲CALLBACK的函數,這些函數就是回調函數。使用
回調函數能夠改善軟件的結構、提升軟件的複用性。好比,在一個規模較大的軟件項目中,能夠將一些資
源或相對獨立的處理模塊封裝到動態鏈接庫(DLL) 中,而後經過回調函數在不一樣的場合來使用這些資源
和模塊。利用回調函數還能夠進行程序間複雜的通訊,實現一些通知的功能,在某些場合它是比消息更
合適的一種方式;在一些特殊的狀況下,回調函數更有不可替代的做用。Win32 API 中有許多回調函數的
應用,在進行軟件設計時也會常常用到這種函數,而有些時候則須要編寫本身的回調函數。所以,理解回
調函數的原理並掌握它的基本用法是很是必要的。
C ++ 是當代使用最普遍的語言,從嵌入式系統到大型機系統、從LINUX 到WINDOWS ,在大型系統的
編制中,處處都是它的身影。它以高效和易編程性得到了許多資深程序員的信賴。在DirectX Play 開發過
程中,常常須要使用到回調函數,直接使用回調函數顯得複雜麻煩,採用用C + + 實現對回調函數的封裝,
使回調函數變得方便實用,對於DirectX Play 等編程就顯得是很是有意義的。
回調函數簡單講就是一個函數指針。寫一個函數,而後把函數地址傳遞給這個函數指針就能夠了。
回調函數的原形對C ++ 的成員函數用作回調函數的影響是什麼?
編寫回調函數簡單地說就是函數原形一致。函數的輸入參數,輸出參數一致是很容易保證的。要注
意調用類型一致性。函數傳參數有好幾種類型,搞錯了傳參數的方式,系統必然運行錯誤。通常來講都
是WINAPI 傳參數方式。要注意C ++ 的類的成員函數和通常的C 函數的區別。C + + 類採用this 規則傳
遞函數。在使用類的成員函數做爲回調函數,要求該成員函數被聲名爲靜態成員函數,而且注意函數聲
名的時候要同時聲明好參數傳遞規則。
2.個人回調函數的理解,
模塊A ,模塊B,
若是模塊B 中調用模塊A 的東西, 在模塊A中發生一個事件或操做,調用B的函數處理,
這就才用了回調函數的機制。
3.例子的實現
模塊A的代碼
#ifndef __A_H
#define __A_H
class A
{
public:
A(void){}
public:
~A(void){}
typedef void (*perfect)(int ); //聲明回調函數
public:
void CallBackFunc(void (*perfect)(int ),int n) //給模塊B調用的函數
{
perfect(n); //調用的函數
}
};
#endif //__A_H
模塊B的代碼
#include <iostream>
#include "A.h"
using namespace std;
void perfect(int n) //這個函數要求是全局的,或者是類中的靜態成員變量
{
cout<<n<<endl;
}
int main()
{
A a;
a.CallBackFunc(perfect,100); //調用模塊A的代碼。
return 0;
}
靜態成員函數調用非靜態成員函數 應用於回調函數
代碼以下
模塊A的代碼
#ifndef __CALLBACKTEST_H
#define __CALLBACKTEST_H
class CallBackTest
{
public:
CallBackTest(void);
public:
~CallBackTest(void);
typedef void (*perfect)(void*,int ); //聲明回調函數
public:
void CallBackFunc(void* pThisOBject,void (*perfect)(void*,int ),int n)
{
p=perfect;
m_n=n;
m_pThisObject=pThisOBject;
}
void ExecBackFunc()
{
p(m_pThisObject,m_n);
}
private:
perfect p;
int m_n;
void* m_pThisObject;
};
#endif //__CALLBACKTEST_H
模塊B的代碼
#include <iostream>
#include "CallBackTest.h"
using namespace std;
class testMai
{
public:
static void perfect(void *pdata,int n)
{
testMai* pObject=(testMai*)pdata;
pObject->test(n);
}
void Exec()
{
CallBackTest callbackTest;
callbackTest.CallBackFunc(&this,perfect,100);
cout<<"ni hao"<<endl;
callbackTest.ExecBackFunc();
}
void test(int n)
{
int i=1;
int count=0;
m=9;
for(i=1;i<n;i++)
{
if(0==n%i)
{
count+=i;
}
}
if(count==n)
//printf("%d是完數\n",n);
{
cout<<n<<"是完數"<<endl;
}
else
{
cout<<n<<"bu shi de "<<endl;
}
}
private:
int m;
};
int main()
{
testMai testMai;
testMai.Exec();
return 0;
}