歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++ 成員函數 回調函數的實現

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

日期:2017/3/1 9:43:18   编辑:Linux編程

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的函數處理,這就才用了回調函數的機制。

C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm

讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm

讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm

C++11 獲取系統時間庫函數 time since epoch http://www.linuxidc.com/Linux/2014-03/97446.htm

C++11中正則表達式測試 http://www.linuxidc.com/Linux/2012-08/69086.htm

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

Copyright © Linux教程網 All Rights Reserved