C++ 成員函數 回調函數的實現

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;
}
相關文章
相關標籤/搜索