自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C++程序設(shè)計(jì)建立對(duì)象間消息連接(附程序清單)

開發(fā) 后端
標(biāo)識(shí)對(duì)象間的關(guān)系或建立對(duì)象間的消息連接是面向?qū)ο蟪绦蛟O(shè)計(jì)的一項(xiàng)重要任務(wù)。本文著重從C++程序設(shè)計(jì)的角度,提出一種建立對(duì)象間消息連接的實(shí)用方法,給各位讀者提供C++學(xué)習(xí)的參考。

  用過(guò)C++進(jìn)行過(guò)面向對(duì)象程序設(shè)計(jì)的用戶都知道,程序中的對(duì)象很少單獨(dú)存在。不考慮對(duì)象間的相互作用幾乎是不可能的。所以,標(biāo)識(shí)對(duì)象間的關(guān)系或建立對(duì)象間的消息連接是面向?qū)ο蟪绦蛟O(shè)計(jì)的一項(xiàng)重要任務(wù)。本文著重從C++程序設(shè)計(jì)的角度,提出一種建立對(duì)象間消息連接的實(shí)用方法。如果你想詳細(xì)了解面向?qū)ο蟪绦蛟O(shè)計(jì)技術(shù),請(qǐng)參閱有關(guān)專著。

  大家都知道對(duì)象是數(shù)據(jù)和方法的封裝體。在C++中,它們分別表現(xiàn)為數(shù)據(jù)成員和成員函數(shù)。程序設(shè)計(jì)者通過(guò)執(zhí)行對(duì)象的各種方法,來(lái)改變對(duì)象的狀態(tài)(即改變對(duì)象的屬性數(shù)據(jù))。從而使該對(duì)象發(fā)生某些“事件”。當(dāng)一對(duì)象發(fā)生某事件時(shí),它通常需向其它相關(guān)對(duì)象發(fā)送“消息”,請(qǐng)求它們作出一些處理。 這時(shí),發(fā)生事件并向其它對(duì)象請(qǐng)求處理的對(duì)象被稱為“事件對(duì)象”,而處理事件的對(duì)象被稱為“回調(diào)對(duì)象”?;卣{(diào)對(duì)象對(duì)事件的處理稱為“回調(diào)函數(shù)”。在C++中,這一過(guò)程相當(dāng)于:當(dāng)事件對(duì)象發(fā)生事件時(shí),調(diào)用回調(diào)對(duì)象的某些成員函數(shù)。通常的作法是回調(diào)對(duì)象向事件對(duì)象傳遞對(duì)象指針。但這種方法不通用。為了減少程序設(shè)計(jì)的工作量,本文提出一種建立對(duì)象間消息連接的系統(tǒng)方法。它的思路是:將“事件發(fā)生→請(qǐng)求處理→執(zhí)行處理”這一過(guò)程抽象成一個(gè)“回調(diào)”(CallBack)類。通過(guò)繼承,用戶可以輕松獲取建立對(duì)象間消息連接的機(jī)制。

  一、回調(diào)類的數(shù)據(jù)結(jié)構(gòu)及其成員函數(shù)

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

事件名 回調(diào)對(duì)象指針 回調(diào)函數(shù)指針
“event” pointerCBO pointerToCBF或pointerTOCBSF

  AddCallBack: 注冊(cè)事件名和指向回調(diào)函數(shù),回調(diào)對(duì)象的指針

  CallCallBack: 在回調(diào)表中,檢索注冊(cè)在指定事件上回調(diào)函數(shù)并調(diào)用它們

  事件發(fā)生時(shí),調(diào)用CallCallBack函數(shù)

  對(duì)事件event進(jìn)行處理的成員函數(shù)

  從CallBack類繼承的回調(diào)表callBackList, 成員函數(shù)AddCallBack和CallCallBack。

  當(dāng)回調(diào)函數(shù)為靜態(tài)成員函數(shù)或普通C函數(shù)時(shí), pointerToCBO為NULL。

  事件名是回調(diào)表callBackLis中的檢索關(guān)鍵字。

  回調(diào)對(duì)象中其它成員函數(shù)

  CallBack類的成員函數(shù)AddCallBack用來(lái)將回調(diào)函數(shù)注冊(cè)到事件對(duì)象的回調(diào)表中。它有兩個(gè)重載版本:

  1. void CallBack::AddCallBack(char *event,CallBackFunction cbf,CallBack *p);   
  2. void CallBack::AddCallBack(char *event,CallBackStaticFunction cbsf); 

  其中,***個(gè)AddCallBack用來(lái)將某回調(diào)對(duì)象的成員函數(shù)注冊(cè)到事件對(duì)象的回調(diào)表中。第二個(gè)AddCallBack用來(lái)將或某回調(diào)類的靜態(tài)成員函數(shù)注冊(cè)到事件對(duì)象的回調(diào)表中。在上參數(shù)表中,event是指向事件名字符串的指針,p是指向回調(diào)對(duì)象的指針,cbf和cbsf分別是指向成員函數(shù)及靜態(tài)成員函數(shù)(或普通函數(shù))的指針。當(dāng)回調(diào)函數(shù)來(lái)自某回調(diào)對(duì)象SomeObject時(shí),傳遞成員函數(shù)指針應(yīng)采用如下格式:(CallBackFunction)&SomeObject::MemberFunctionName; 傳遞SomeObject類的某靜態(tài)成員函數(shù)指針應(yīng)采用格式:(CallBackStaticFunction)& SomeObject::FunctionName;傳遞程序中普通函數(shù)指針時(shí),只需傳遞函數(shù)名即可。

  CallBack類的成員函數(shù)void CallBack::CallCallBack(char *ename, CallData calldata = NULL)用來(lái)調(diào)用注冊(cè)在事件ename上的所有回調(diào)函數(shù)。其中,calldata為數(shù)據(jù)指針(CallData實(shí)際上就是void*,詳見程序清單)。事件對(duì)象可通過(guò)它向回調(diào)對(duì)象傳遞有用的數(shù)據(jù)。該成員函數(shù)通常在事件對(duì)象的成員函數(shù)中調(diào)用,因?yàn)橥ǔV挥惺录?duì)象的成員函數(shù)才能改變對(duì)象的內(nèi)部數(shù)據(jù),從而使某些事件發(fā)生。

  成員函數(shù)RemoveCallback用來(lái)刪除注冊(cè)在事件對(duì)象上的回調(diào)函數(shù)。它的三個(gè)重載版本依次為:

  1. void CallBack::RemoveCallBack(char *event,CallBackFunction cbf,CallBack *p);   
  2. void CallBack::RemoveCallBack(char *event,CallBackStaticFunction cbsf);   
  3. void CallBack::RemoveCallBack(char *event); 

  其中,event,cbf,cbsf,p等參數(shù)和成員函數(shù)AddCallBack中各參數(shù)一樣。***個(gè)RemoveCallBack用于刪除注冊(cè)在事件event上某回調(diào)對(duì)象的一個(gè)成員函數(shù)。第二個(gè)RemoveCallBack用于刪除注冊(cè)在事件event上的某普通函數(shù)或某回調(diào)類的一個(gè)靜態(tài)成員函數(shù)。第三個(gè)RemoveCallBack用于刪除注冊(cè)在事件event上的全部回調(diào)函數(shù)。

#p#

  二、CallBack類的使用方法

  使用CallBack類,可按以下步驟進(jìn)行:

  1.確定程序中哪些對(duì)象間存在關(guān)系,需要建立消息連接。并確定在各特定消息連接關(guān)系中,哪個(gè)對(duì)象是事件對(duì)象,哪個(gè)對(duì)象是回調(diào)對(duì)象。

  2.事件對(duì)象類和回調(diào)對(duì)象類都必須從CallBack類繼承,以獲得回調(diào)支持。

  3.為事件對(duì)象注冊(cè)回調(diào)數(shù)據(jù)。包括:事件名,回調(diào)函數(shù)名,指向回調(diào)對(duì)象的指針。

  4.當(dāng)你感興趣的事件發(fā)生時(shí),在事件對(duì)象類引發(fā)事件的成員函數(shù)中調(diào)用CallCallBack函數(shù)。

  下面是一個(gè)具體的例子。通過(guò)它你會(huì)對(duì)Callback類的使用方法有進(jìn)一步的了解。

  1. //測(cè)試程序文件:test.cpp    
  2. #include"callback.h"   
  3. //“揚(yáng)聲器”類    
  4. class Speaker:public CallBack   
  5. {   
  6. private:  
  7.  int volume;  
  8. public:  
  9.  Speaker(int v): volume(v) {}  
  10. void IncreaseVolume(int v) //增加音量成員函數(shù)  
  11.  {  
  12.   volume += v;  
  13.   if(volume > 20){ //“音量大于20”事件發(fā)生了  
  14.    //調(diào)用注冊(cè)在兩事件上的回調(diào)函數(shù)  
  15.    CallCallBack("音量改變了");  
  16.    CallCallBack("音量大于20", &volume);  
  17.  }  
  18. }   
  19. void DecreaseVolume(int v) //降低音量成員函數(shù)   
  20. {  
  21.  volume -= v;  
  22.  if(volume < 5){ //“音量小于5”事件發(fā)生了  
  23.  //調(diào)用注冊(cè)在兩事件上的回調(diào)函數(shù)  
  24.   CallCallBack("音量改變了");  
  25.   CallCallBack("音量小于5", &volume);  
  26. }   
  27. }   
  28. };   
  29. //“耳朵”類    
  30. class Ear : public CallBack   
  31. {  
  32.  public:  
  33.   static void Response(CallData callData) //對(duì)“音量改變”的反應(yīng)  
  34.   {  
  35.    cout<<"音量改變了."<<endl;  
  36.   }   
  37. void HighVoiceResponse(CallData callData)//對(duì)高音的反應(yīng)   
  38. {  
  39.  cout<<”喂!太吵了!現(xiàn)在音量是:"<<*((int *)callData)<<endl;  
  40. }   
  41. void LowVoiceResponse(CallData callData)// 對(duì)低音的反應(yīng)   
  42. {  
  43.  cout<<"啊!我聽不清了?,F(xiàn)在音量是:"<<*((int *)callData)<<endl;  
  44. }   
  45. };   
  46. void main(void)    
  47. {  
  48. Speaker s(10); //現(xiàn)在音量為10  
  49. Ear e;   
  50. //為事件對(duì)象s注冊(cè)回調(diào)函數(shù)  
  51. s.AddCallBack("音量大于20”,(CallBackFunction)&Ear::HighVoiceResponse,&e);  
  52. s.AddCallBack("音量小于5”,(CallBackFunction)&Ear::LowVoiceResponse,&e);  
  53. s.AddCallBack("音量改變了",(CallBackStaticFunction)&Ear::Response);  
  54. s.IncreaseVolume(12);//將音量增加12,現(xiàn)在音量位22  
  55. s.DecreaseVolume(20);//將音量減少20,現(xiàn)在音量位2   

  運(yùn)行結(jié)果:

  音量改變了.

  喂!太吵了!現(xiàn)在音量是:22

  音量改變了.

  啊!我聽不清了。現(xiàn)在音量是:2

  在上例中,揚(yáng)聲器對(duì)象s為事件對(duì)象,耳朵對(duì)象e為回調(diào)對(duì)象。。s上被注冊(cè)了三個(gè)事件:“音量改變了”,“音量大于20”,“音量小于5”。 回調(diào)函數(shù)分別為:Ear::Response, Ear::HighVoiceResponse,Ear::LowVoiceResponse。當(dāng)揚(yáng)聲器s通過(guò)其成員函數(shù)IncreaseVolume和 DecreaseVolume改變音量時(shí),回調(diào)對(duì)象e會(huì)自動(dòng)作出反應(yīng)??梢?,通過(guò)使用CallBack類,在對(duì)象間建立消息連接已變?yōu)橐豁?xiàng)很簡(jiǎn)單和優(yōu)美的工作。

#p#

  附:程序清單(本程序在MS VC++5.0和TC++3.0上均編譯通過(guò))

  1. //回調(diào)類的類結(jié)構(gòu):callback.h   
  2. #ifndef _CALLBACK_H   
  3. #define _CALLBACK_H   
  4. #include<stdlib.h>   
  5. #include<string.h>   
  6. #include<iostream.h> 
  7. #define CALLBACKLIST_INIT_SIZE 10   
  8. #define CALLBACKLIST_INCREMENT 5   
  9. class CallBack;   
  10. typedef void *CallData;//回調(diào)數(shù)據(jù)指針類型定義   
  11. typedef void (CallBack::*CallBackFunction)(CallData); //指向回調(diào)成員函數(shù)的指針   
  12. typedef void (*CallBackStaticFunction)(CallData); //指向靜態(tài)成員函數(shù)或普通函數(shù)的指針類型定義   
  13. class EventRecord{    
  14. private:   
  15. char *eventName; //回調(diào)事件名稱   
  16. CallBack *pointerToCBO;//指向回調(diào)對(duì)象的指針   
  17. //指向成員函數(shù)的指針和指向靜態(tài)成員函數(shù)(或普通函數(shù))指針的共用體   
  18. union{   
  19. CallBackFunction pointerToCBF;   
  20. CallBackStaticFunction pointerToCBSF;   
  21. };   
  22. public:   
  23. EventRecord(void); //事件記錄類的缺省構(gòu)造函數(shù)   
  24. //構(gòu)造包含成員函數(shù)的事件記錄   
  25. EventRecord(char *ename,CallBack *pCBO,CallBackFunction pCBF);   
  26. //構(gòu)造包含靜態(tài)成員函數(shù)或普通函數(shù)的事件記錄   
  27. EventRecord(char *ename,CallBackStaticFunction pCBSF);   
  28. ~EventRecord(void);//析構(gòu)事件記錄   
  29. void operator = (const EventRecord& er);//重載賦值運(yùn)算符   
  30. //判斷當(dāng)前事件記錄的事件名是否為ename   
  31. int operator == (char *ename) const;   
  32. //判斷當(dāng)前事件記錄是否和指定事件記錄相等   
  33. int operator == (const EventRecord& er) const;   
  34. void Flush(void); //將當(dāng)前事件記錄清空   
  35. int IsEmpty(voidconst;//判斷事件記錄是否為空(即事件名是否為空)   
  36. friend class CallBack; //讓CallBack類能訪問(wèn)EventRecord的私有成員;   
  37. };   
  38. class CallBack {    
  39. private:   
  40. EventRecord *callBackList; //回調(diào)事件表   
  41. int curpos; //當(dāng)前事件記錄位置   
  42. int lastpos; //回調(diào)表中***一空閑位置   
  43. int size; //回調(diào)表的大小   
  44. void MoveFirst(void) { curpos = 0; }//將當(dāng)前記錄置為***條記錄   
  45. void MoveNext(void//將下一條記錄置為當(dāng)前記錄   
  46. {   
  47. if(curpos == lastpos) return;   
  48. curpos++;   
  49. }   
  50. //判斷回調(diào)表是否被遍歷完    
  51. int EndOfList(voidconst { return curpos == lastpos; }   
  52. public:   
  53. CallBack(void);//構(gòu)造函數(shù)   
  54. CallBack(const CallBack& cb);//拷貝構(gòu)造函數(shù)   
  55. ~CallBack(void);//析構(gòu)函數(shù)   
  56. void operator = (const CallBack& cb);// 重載賦值運(yùn)算符   
  57. //將回調(diào)對(duì)象的成員函數(shù)、靜態(tài)成員函數(shù)(或普通函數(shù))   
  58. //注冊(cè)為事件對(duì)象的回調(diào)函數(shù)   
  59. void AddCallBack(char *event,CallBackFunction cbf,CallBack *p);   
  60. void AddCallBack(char *event,CallBackStaticFunction cbsf);   
  61. //刪除注冊(cè)在指定事件上的回調(diào)函數(shù)   
  62. void RemoveCallBack(char *event,CallBackFunction cbf,CallBack *p);   
  63. void RemoveCallBack(char *event,CallBackStaticFunction cbsf);   
  64. void RemoveCallBack(char *event);// 刪除某事件的全部記錄   
  65. //執(zhí)行注冊(cè)在某一事件上的所有回調(diào)函數(shù)   
  66. void CallCallBack(char *event, CallData calldata = NULL);   
  67. };   
  68. #endif   
  69. //回調(diào)類的實(shí)現(xiàn):callback.cpp    
  70. #include"callback.h"   
  71.  //EventRecord類的實(shí)現(xiàn)   
  72. EventRecord::EventRecord(void)   
  73. {   
  74. eventName = NULL;   
  75. pointerToCBO = NULL;   
  76. //因?yàn)閟izeof(CallBackFunction) > sizeof(CallBackStaticFunction)   
  77. pointerToCBF = NULL;   
  78. }   
  79. EventRecord::EventRecord(char *ename, CallBack *pCBO, CallBackFunction pCBF)   
  80. :pointerToCBO(pCBO), pointerToCBF(pCBF)   
  81. {   
  82. eventName = strdup(ename);   
  83. }   
  84. EventRecord::EventRecord(char *ename, CallBackStaticFunction pCBSF)   
  85. :pointerToCBO(NULL), pointerToCBSF(pCBSF)   
  86. {   
  87. eventName = strdup(ename);   
  88. }   
  89. EventRecord::~EventRecord(void)    
  90. {   
  91. if(eventName) delete eventName;   
  92. }   
  93. void EventRecord::operator = (const EventRecord& er)    
  94. {   
  95. if(er.eventName)   
  96. eventName = strdup(er.eventName);   
  97. else  
  98. eventName = NULL;   
  99. pointerToCBO = er.pointerToCBO;   
  100. pointerToCBF = er.pointerToCBF;   
  101. }   
  102. int EventRecord::operator == (char *ename) const    
  103. {   
  104. if((eventName == NULL)||ename == NULL)   
  105. return eventName == ename;   
  106. else  
  107. return strcmp(eventName,ename) == 0;   
  108. }   
  109. int EventRecord::operator == (const EventRecord& er) const  
  110. {   
  111. return (er == eventName) /*er和eventname不能交換位置*/  
  112. &&(pointerToCBO == er.pointerToCBO)   
  113. &&(pointerToCBO ?   
  114. (pointerToCBF == er.pointerToCBF):   
  115. (pointerToCBSF == er.pointerToCBSF));   
  116. }   
  117. void EventRecord::Flush(void)    
  118. {   
  119. if(eventName){   
  120. delete eventName;  
  121. eventName = NULL;  
  122. }   
  123. pointerToCBO = NULL;   
  124. pointerToCBF = NULL;   
  125. }   
  126. int EventRecord::IsEmpty(voidconst  
  127. {   
  128. if(eventName == NULL)   
  129. return 1;   
  130. else  
  131. return 0;   
  132. }   
  133. //Callback類的實(shí)現(xiàn)    
  134. CallBack::CallBack(void)   
  135. {   
  136. //按初始尺寸為回調(diào)表分配內(nèi)存空間   
  137. callBackList = new EventRecord[CALLBACKLIST_INIT_SIZE];   
  138. if(!callBackList){   
  139. cerr<<"CallBack: memory allocation error."<<endl;   
  140. exit(1);   
  141. }   
  142. size = CALLBACKLIST_INIT_SIZE;   
  143. lastpos = 0;   
  144. curpos = 0;   
  145. }   
  146. CallBack::CallBack(const CallBack& cb): curpos(cb.curpos),lastpos(cb.lastpos),size(cb.size)    
  147. {   
  148. callBackList = new EventRecord[size];   
  149. if(!callBackList){   
  150. cerr<<"CallBack: memory allocation error."<<endl;   
  151. exit(1);   
  152. }   
  153. //一一復(fù)制各條事件記錄   
  154. for(int i = 0; i < size; i++) callBackList[i] = cb.callBackList[i];   
  155. }   
  156. void CallBack::operator = (const CallBack& cb)    
  157. {   
  158. curpos = cb.curpos;   
  159. lastpos = cb.lastpos;   
  160. size = cb.size;   
  161. delete [] callBackList;//刪除舊的回調(diào)表   
  162. callBackList = new EventRecord[size];//重新分配內(nèi)存空間   
  163. if(!callBackList){   
  164. cerr<<"CallBack: memory allocation error."<<endl;   
  165. exit(1);   
  166. }   
  167. //一一復(fù)制各條事件記錄   
  168. for(int i = 0; i < size; i++) callBackList[i] = cb.callBackList[i];   
  169. }   
  170. CallBack::~CallBack(void)    
  171. {   
  172. delete [] callBackList;   
  173. }   
  174. void CallBack::AddCallBack(char *event, CallBackFunction pCBF, CallBack *pCBO)    
  175. {   
  176. //如事件名為空,退出   
  177. if( (event == NULL)?1:(strlen(event) == 0)) return;   
  178. //尋找因刪除事件記錄而產(chǎn)生的***個(gè)空閑位置,并填寫新事件記錄   
  179. for(int start=0;start<lastpos;start++)   
  180. if(callBackList[start].IsEmpty()){   
  181. callBackList[start] = EventRecord(event,pCBO,pCBF);   
  182. break;   
  183. }   
  184. if(start < lastpos) return//確實(shí)存在空閑位置   
  185. //沒(méi)有空閑位置,在回調(diào)表后追加新記錄   
  186. if(lastpos == size) //回調(diào)表已滿,需“伸長(zhǎng)”   
  187. {   
  188. EventRecord *tempList = callBackList;//暫存舊回調(diào)表指針   
  189. //以一定的步長(zhǎng)“伸長(zhǎng)”回調(diào)表   
  190. callBackList = new EventRecord[size + CALLBACKLIST_INCREMENT];   
  191. if(!callBackList){   
  192. cerr<<"CallBack: memory allocation error."<<endl;   
  193. exit(1);   
  194. }   
  195. //復(fù)制舊回調(diào)表中的記錄   
  196. for(int i = 0; i < size; i++) callBackList[i] = tempList[i];   
  197. delete [] tempList;//刪除舊回調(diào)表   
  198. size += CALLBACKLIST_INCREMENT;//記下新回調(diào)表的尺寸   
  199. }   
  200. //構(gòu)造新的事件記錄并將其填入回調(diào)表中   
  201. callBackList[lastpos] = EventRecord(event,pCBO,pCBF);   
  202. lastpos++;   
  203. }   
  204. void CallBack::AddCallBack(char *event,CallBackStaticFunction pCBSF)    
  205. {   
  206. if( (event == NULL)?1:(strlen(event) == 0)) return;   
  207. for(int start=0;start<lastpos;start++)   
  208. if(callBackList[start].IsEmpty()){   
  209. callBackList[start] = EventRecord(event,pCBSF);   
  210. break;   
  211. }   
  212. if(start < lastpos) return//a hole is found   
  213. if(lastpos == size) //event list is insufficient   
  214. {   
  215. EventRecord *tempList = callBackList;   
  216. callBackList = new EventRecord[size + CALLBACKLIST_INCREMENT];    
  217. if(!callBackList){   
  218. cerr<<"CallBack: memory allocation error."<<endl;   
  219. exit(1);   
  220. }   
  221. for(int i = 0; i < size; i++) callBackList[i] = tempList[i];   
  222. delete [] tempList;   
  223. size += CALLBACKLIST_INCREMENT;   
  224. }   
  225. callBackList[lastpos] = EventRecord(event,pCBSF);   
  226. lastpos++;   
  227. }   
  228. //刪除注冊(cè)在指定事件上的成員函數(shù)   
  229. void CallBack::RemoveCallBack(char *event, CallBackFunction pCBF, CallBack *pCBO)   
  230. {   
  231. if( (event == NULL)?1:(strlen(event) == 0)) return;   
  232. EventRecord er(event,pCBO,pCBF);   
  233. for(int i = 0; i < lastpos; i++)   
  234. if(callBackList[i] == er) callBackList[i].Flush();   
  235. }   
  236. //刪除注冊(cè)在指定事件上的靜態(tài)成員函數(shù)或普通函數(shù)   
  237. void CallBack::RemoveCallBack(char *event,CallBackStaticFunction pCBSF)   
  238. {   
  239. if( (event == NULL)?1:(strlen(event) == 0)) return;   
  240. EventRecord er(event,pCBSF);    
  241. for(int i = 0; i < lastpos; i++)   
  242. if(callBackList[i] == er) callBackList[i].Flush();   
  243. }   
  244. //刪除注冊(cè)在指定事件上的所有回調(diào)函數(shù)   
  245. void CallBack::RemoveCallBack(char *event)   
  246. {   
  247. if( (event == NULL)?1:(strlen(event) == 0)) return;   
  248. for(int i = 0; i < lastpos; i++)  
  249. if(callBackList[i] == event) callBackList[i].Flush();   
  250. }   
  251. void CallBack::CallCallBack(char *event, CallData callData)   
  252. {   
  253. if( (event == NULL)?1:(strlen(event) == 0)) return;    
  254. CallBack *pCBO;   
  255. CallBackFunction pCBF;   
  256. CallBackStaticFunction pCBSF;   
  257. MoveFirst();   
  258. while(!EndOfList())   
  259. {   
  260. //如當(dāng)前事件記錄和指定事件不匹配,轉(zhuǎn)入下一條記錄繼續(xù)循環(huán)   
  261. if(!(callBackList[curpos] == event))   
  262. {   
  263. MoveNext();   
  264. continue;   
  265. }   
  266. //如找到匹配記錄   
  267. pCBO = callBackList[curpos].pointerToCBO;   
  268. //如事件記錄中回調(diào)對(duì)象指針為空,說(shuō)明該記錄中保存的是靜態(tài)函數(shù)指針   
  269. if(pCBO == NULL){   
  270. pCBSF = callBackList[curpos].pointerToCBSF;   
  271. pCBSF(callData);//調(diào)用該靜態(tài)回調(diào)函數(shù)   
  272. }   
  273. else //如事件記錄中回調(diào)對(duì)象指針?lè)强?,說(shuō)明該記錄中保存的是成員函數(shù)指針   
  274. {   
  275. pCBF = callBackList[curpos].pointerToCBF;   
  276. (pCBO->*pCBF)(callData);// 調(diào)用該回調(diào)對(duì)象的成員函數(shù)   
  277. }   
  278. MoveNext();   
  279. }   

【編輯推薦】

  1. C++對(duì)象傳遞實(shí)際應(yīng)用問(wèn)題解疑
  2. c++編程常用工具
  3. 程序員必看 c++筆試題匯總
  4. 編程必讀 15個(gè)編程好習(xí)慣
  5. c++最基礎(chǔ)的20條規(guī)則
責(zé)任編輯:韓亞珊 來(lái)源: 天極網(wǎng)
相關(guān)推薦

2010-01-28 09:54:27

C++程序設(shè)計(jì)

2011-07-10 15:36:54

C++

2010-01-27 14:24:15

C++程序設(shè)計(jì)

2010-01-13 18:30:18

CC++程序設(shè)計(jì)

2010-01-11 17:43:23

C++程序設(shè)計(jì)

2010-01-11 10:34:22

C++程序

2010-01-08 16:10:59

C++語(yǔ)言

2011-08-05 15:46:32

Objective-C 程序設(shè)計(jì)

2012-03-14 10:48:05

C#

2011-07-05 15:22:04

程序設(shè)計(jì)

2011-07-05 15:59:57

面向?qū)ο缶幊?/a>

2010-01-11 17:22:02

2011-07-05 16:05:43

面向?qū)ο缶幊?/a>

2009-09-02 13:22:23

C#組件化程序設(shè)計(jì)

2011-12-06 09:42:51

Java

2022-06-07 14:13:58

Simula編程語(yǔ)言GNU cim

2013-12-12 16:30:20

Lua腳本語(yǔ)言

2011-12-06 12:16:58

Java

2009-09-02 17:28:26

C#程序設(shè)計(jì)Windows窗體

2014-03-13 11:25:43

C++OpenCV
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)