龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C++程序设计建立对象间消息连接(附程序清单)(1)(3)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
附:程序清单 (本程序在MS VC++5.0和TC++3.0上均编译通过) //回调类的类结构:callback.h #ifndef_CALLBACK_H #define_CALLBACK_H #includestdlib.h #includestring.h #includeiostream.h #d

附:程序清单(本程序在MS VC++5.0和TC++3.0上均编译通过)

  1. //回调类的类结构: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;//回调数据指针类型定义   
  11. typedef void (CallBack::*CallBackFunction)(CallData); //指向回调成员函数的指针   
  12. typedef void (*CallBackStaticFunction)(CallData); //指向静态成员函数或普通函数的指针类型定义   
  13. class EventRecord{    
  14. private:   
  15. char *eventName; //回调事件名称   
  16. CallBack *pointerToCBO;//指向回调对象的指针   
  17. //指向成员函数的指针和指向静态成员函数(或普通函数)指针的共用体   
  18. union{   
  19. CallBackFunction pointerToCBF;   
  20. CallBackStaticFunction pointerToCBSF;   
  21. };   
  22. public:   
  23. EventRecord(void); //事件记录类的缺省构造函数   
  24. //构造包含成员函数的事件记录   
  25. EventRecord(char *ename,CallBack *pCBO,CallBackFunction pCBF);   
  26. //构造包含静态成员函数或普通函数的事件记录   
  27. EventRecord(char *ename,CallBackStaticFunction pCBSF);   
  28. ~EventRecord(void);//析构事件记录   
  29. void operator = (const EventRecord& er);//重载赋值运算符   
  30. //判断当前事件记录的事件名是否为ename   
  31. int operator == (char *ename) const;   
  32. //判断当前事件记录是否和指定事件记录相等   
  33. int operator == (const EventRecord& er) const;   
  34. void Flush(void); //将当前事件记录清空   
  35. int IsEmpty(voidconst;//判断事件记录是否为空(即事件名是否为空)   
  36. friend class CallBack; //让CallBack类能访问EventRecord的私有成员;   
  37. };   
  38. class CallBack {    
  39. private:   
  40. EventRecord *callBackList; //回调事件表   
  41. int curpos; //当前事件记录位置   
  42. int lastpos; //回调表中最后一空闲位置   
  43. int size; //回调表的大小   
  44. void MoveFirst(void) { curpos = 0; }//将当前记录置为第一条记录   
  45. void MoveNext(void//将下一条记录置为当前记录   
  46. {   
  47. if(curpos == lastpos) return;   
  48. curpos++;   
  49. }   
  50. //判断回调表是否被遍历完    
  51. int EndOfList(voidconst { return curpos == lastpos; }   
  52. public:   
  53. CallBack(void);//构造函数   
  54. CallBack(const CallBack& cb);//拷贝构造函数   
  55. ~CallBack(void);//析构函数   
  56. void operator = (const CallBack& cb);// 重载赋值运算符   
  57. //将回调对象的成员函数、静态成员函数(或普通函数)   
  58. //注册为事件对象的回调函数   
  59. void AddCallBack(char *event,CallBackFunction cbf,CallBack *p);   
  60. void AddCallBack(char *event,CallBackStaticFunction cbsf);   
  61. //删除注册在指定事件上的回调函数   
  62. void RemoveCallBack(char *event,CallBackFunction cbf,CallBack *p);   
  63. void RemoveCallBack(char *event,CallBackStaticFunction cbsf);   
  64. void RemoveCallBack(char *event);// 删除某事件的全部记录   
  65. //执行注册在某一事件上的所有回调函数   
  66. void CallCallBack(char *event, CallData calldata = NULL);   
  67. };   
  68. #endif   
  69. //回调类的实现:callback.cpp    
  70. #include"callback.h"   
  71.  //EventRecord类的实现   
  72. EventRecord::EventRecord(void)   
  73. {   
  74. eventName = NULL;   
  75. pointerToCBO = NULL;   
  76. //因为sizeof(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类的实现    
  134. CallBack::CallBack(void)   
  135. {   
  136. //按初始尺寸为回调表分配内存空间   
  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. //一一复制各条事件记录   
  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;//删除旧的回调表   
  162. callBackList = new EventRecord[size];//重新分配内存空间   
  163. if(!callBackList){   
  164. cerr<<"CallBack: memory allocation error."<<endl;   
  165. exit(1);   
  166. }   
  167. //一一复制各条事件记录   
  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. //寻找因删除事件记录而产生的第一个空闲位置,并填写新事件记录   
  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//确实存在空闲位置   
  185. //没有空闲位置,在回调表后追加新记录   
  186. if(lastpos == size) //回调表已满,需“伸长”   
  187. {   
  188. EventRecord *tempList = callBackList;//暂存旧回调表指针   
  189. //以一定的步长“伸长”回调表   
  190. callBackList = new EventRecord[size + CALLBACKLIST_INCREMENT];   
  191. if(!callBackList){   
  192. cerr<<"CallBack: memory allocation error."<<endl;   
  193. exit(1);   
  194. }   
  195. //复制旧回调表中的记录   
  196. for(int i = 0; i < size; i++) callBackList[i] = tempList[i];   
  197. delete [] tempList;//删除旧回调表   
  198. size += CALLBACKLIST_INCREMENT;//记下新回调表的尺寸   
  199. }   
  200. //构造新的事件记录并将其填入回调表中   
  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. //删除注册在指定事件上的成员函数   
  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. //删除注册在指定事件上的静态成员函数或普通函数   
  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. //删除注册在指定事件上的所有回调函数   
  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. //如当前事件记录和指定事件不匹配,转入下一条记录继续循环   
  261. if(!(callBackList[curpos] == event))   
  262. {   
  263. MoveNext();   
  264. continue;   
  265. }   
  266. //如找到匹配记录   
  267. pCBO = callBackList[curpos].pointerToCBO;   
  268. //如事件记录中回调对象指针为空,说明该记录中保存的是静态函数指针   
  269. if(pCBO == NULL){   
  270. pCBSF = callBackList[curpos].pointerToCBSF;   
  271. pCBSF(callData);//调用该静态回调函数   
  272. }   
  273. else //如事件记录中回调对象指针非空,说明该记录中保存的是成员函数指针   
  274. {   
  275. pCBF = callBackList[curpos].pointerToCBF;   
  276. (pCBO->*pCBF)(callData);// 调用该回调对象的成员函数   
  277. }   
  278. MoveNext();   
  279. }   
精彩图集

赞助商链接