国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C++中建立對象間消息連接的一種系統方法

2019-11-17 05:43:56
字體:
來源:轉載
供稿:網友

  用過C++進行過面向對象程序設計的用戶都知道,程序中的對象很少單獨存在。不考慮對象間的相互作用幾乎是不可能的。所以,標識對象間的關系或建立對象間的消息連接是面向對象程序設計的一項重要任務。本文著重從C++程序設計的角度,提出一種建立對象間消息連接的實用方法。假如你想具體了解面向對象程序設計技術,請參閱有關專著。大家都知道對象是數據和方法的封裝體。在C++中,它們分別表現為數據成員和成員函數。程序設計者通過執行對象的各種方法,來改變對象的狀態(即改變對象的屬性數據)。從而使該對象發生某些“事件”。當一對象發生某事件時,它通常需向其它相關對象發送“消息”,請求它們作出一些處理。 這時,發生事件并向其它對象請求處理的對象被稱為“事件對象”,而處理事件的對象被稱為“回調對象”。回調對象對事件的處理稱為“回調函數”。在C++中,這一過程相當于:當事件對象發生事件時,調用回調對象的某些成員函數。通常的作法是回調對象向事件對象傳遞對象指針。但這種方法不通用。為了減少程序設計的工作量,本文提出一種建立對象間消息連接的系統方法。它的思路是:將“事件發生→請求處理→執行處理”這一過程抽象成一個“回調”(CallBack)類。通過繼續,用戶可以輕松獲取建立對象間消息連接的機制。

一、回調類的數據結構及其成員函數

本文提出的CallBack類支持三種回調函數。它們是:回調對象中的成員函數,屬于回調類的靜態成員函數和普通的C函數。CallBackle類中包含一回調函數表callBackList。它用于記錄事件名稱,指向回調函數及回調對象的指針。該表的每一個節點為一個事件記錄EventRecord。每個事件記錄包含三個域:事件名指針eventName,指向回調對象的指針pointerToCBO,指向回調函數的指針pointerToCBF或pointerToCBSF(其中,pointerToCBF指向回調對象的成員函數,pointerToCBSF指向回調類的靜態成員函數或普通函數。它們同處于一共用體內)。CallBack類所提供的回調機制是這樣的:在事件對象上注冊回調對象中的回調函數;當事件發生時,事件對象在其回調表中檢索并執行回調函數。從而使二者的消息連接得以建立。(關于該類的具體實現,請參閱文后所附的程序清單)

回調對象
事件對象

事件名   回調對象指針   回調函數指針

“event”  pointerCBO   pointerToCBF或
                pointerTOCBSF

- - - - - -

AddCallBack: 注冊事件名和指向回調函數,回調對象的指針

CallCallBack: 在回調表中,檢索注冊在指定事件上回調函數并調用它們

事件發生時,調用CallCallBack函數

對事件event進行處理的成員函數

從CallBack類繼續的回調表callBackList, 成員函數AddCallBack和CallCallBack。

當回調函數為靜態成員函數或普通C函數時, pointerToCBO為NULL。

事件名是回調表callBackLis中的檢索要害字。

回調對象中其它成員函數


CallBack類的成員函數AddCallBack用來將回調函數注冊到事件對象的回調表中。它有兩個重載版本:

void CallBack::AddCallBack(char *event,CallBackFunction cbf,CallBack *p);

void CallBack::AddCallBack(char *event,CallBackStaticFunction cbsf);

其中,第一個AddCallBack用來將某回調對象的成員函數注冊到事件對象的回調表中。第二個AddCallBack用來將或某回調類的靜態成員函數注冊到事件對象的回調表中。在上參數表中,event是指向事件名字符串的指針,p是指向回調對象的指針,cbf和cbsf分別是指向成員函數及靜態成員函數(或普通函數)的指針。當回調函數來自某回調對象SomeObject時,傳遞成員函數指針應采用如下格式:(CallBackFunction)&SomeObject::MemberFunctionName; 傳遞SomeObject類的某靜態成員函數指針應采用格式:(CallBackStaticFunction)& SomeObject::FunctionName;傳遞程序中普通函數指針時,只需傳遞函數名即可。

CallBack類的成員函數void CallBack::CallCallBack(char *ename, CallData calldata = NULL)用來調用注冊在事件ename上的所有回調函數。其中,calldata為數據指針(CallData實際上就是void*,詳見程序清單)。事件對象可通過它向回調對象傳遞有用的數據。該成員函數通常在事件對象的成員函數中調用,因為通常只有事件對象的成員函數才能改變對象的內部數據,從而使某些事件發生。

成員函數RemoveCallback用來刪除注冊在事件對象上的回調函數。它的三個重載版本依次為:

void CallBack::RemoveCallBack(char *event,CallBackFunction cbf,CallBack *p);

void CallBack::RemoveCallBack(char *event,CallBackStaticFunction cbsf);

void CallBack::RemoveCallBack(char *event);

其中,event,cbf,cbsf,p等參數和成員函數AddCallBack中各參數一樣。第一個RemoveCallBack用于刪除注冊在事件event上某回調對象的一個成員函數。第二個RemoveCallBack用于刪除注冊在事件event上的某普通函數或某回調類的一個靜態成員函數。第三個RemoveCallBack用于刪除注冊在事件event上的全部回調函數。


二、CallBack類的使用方法

使用CallBack類,可按以下步驟進行:

1.確定程序中哪些對象間存在關系,需要建立消息連接。并確定在各特定消息連接關系中,哪個對象是事件對象,哪個對象是回調對象。

2.事件對象類和回調對象類都必須從CallBack類繼續,以獲得回調支持。

3.為事件對象注冊回調數據。包括:事件名,回調函數名,指向回調對象的指針。

4.當你感愛好的事件發生時,在事件對象類引發事件的成員函數中調用CallCallBack函數。

下面是一個具體的例子。通過它你會對Callback類的使用方法有進一步的了解。

//測試程序文件:test.cpp

#include"callback.h"

//“揚聲器”類

class Speaker:public CallBack

{

PRivate:

int volume;

public:

Speaker(int v): volume(v) {}

void IncreaseVolume(int v) //增加音量成員函數

{

volume += v;

if(volume > 20){ //“音量大于20”事件發生了

//調用注冊在兩事件上的回調函數

CallCallBack("音量改變了");

CallCallBack("音量大于20", &volume);

}

}

void DecreaseVolume(int v) //降低音量成員函數

{

volume -= v;

if(volume < 5){ //“音量小于5”事件發生了

//調用注冊在兩事件上的回調函數

CallCallBack("音量改變了");

CallCallBack("音量小于5", &volume);

}

}

};

//“耳朵”類

class Ear : public CallBack

{

public:

static void Response(CallData callData) //對“音量改變”的反應

{

cout<<"音量改變了."<<endl;

}

void HighVoiceResponse(CallData callData)//對高音的反應

{

cout<<”喂!太吵了!現在音量是:"<<*((int *)callData)<<endl;

}

void LowVoiceResponse(CallData callData)// 對低音的反應

{

cout<<"啊!我聽不清了。現在音量是:"<<*((int *)callData)<<endl;

}

};

void main(void)

{

Speaker s(10); //現在音量為10

Ear e;

//為事件對象s注冊回調函數

s.AddCallBack("音量大于20”,(CallBackFunction)&Ear::HighVoiceResponse,&e);

s.AddCallBack("音量小于5”,(CallBackFunction)&Ear::LowVoiceResponse,&e);

s.AddCallBack("音量改變了",(CallBackStaticFunction)&Ear::Response);

s.IncreaseVolume(12);//將音量增加12,現在音量位22

s.DecreaseVolume(20);//將音量減少20,現在音量位2

}


運行結果:

音量改變了.

喂!太吵了!現在音量是:22

音量改變了.

啊!我聽不清了。現在音量是:2

在上例中,揚聲器對象s為事件對象,耳朵對象e為回調對象。。s上被注冊了三個事件:“音量改變了”,“音量大于20”,“音量小于5”。 回調函數分別為:Ear::Response, Ear::HighVoiceResponse,Ear::LowVoiceResponse。當揚聲器s通過其成員函數IncreaseVolume和 DecreaseVolume改變音量時,回調對象e會自動作出反應。可見,通過使用CallBack類,在對象間建立消息連接已變為一項很簡單和美麗的工作。


由于筆者水平有限,該類的設計必

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 思南县| 龙南县| 资源县| 当涂县| 阳江市| 西青区| 琼海市| 邯郸县| 林甸县| 桑植县| 通榆县| 巴林左旗| 岱山县| 怀集县| 五莲县| 咸阳市| 南阳市| 古交市| 英吉沙县| 保德县| 新巴尔虎右旗| 塘沽区| 苍溪县| 吴川市| 延边| 大冶市| 丹凤县| 厦门市| 萝北县| 东平县| 登封市| 广德县| 胶州市| 宜城市| 奈曼旗| 甘肃省| 昌都县| 澄迈县| 石渠县| 中阳县| 雷波县|