╪Ч╤тоС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类,在对象间建立消息连接已变为一项很简单和优美的工作。
由于笔者水平有限,该类的设计必有不完善之处。如果您对它感兴趣,笔者可与各位C++玩家共同探讨这类问题。联系方式:fei_xiang@263.net
附:程序清单(本程序在MS VC++5.0和TC++3.0上均编译通过) //回调类的类结构:callback.h
#ifndef _CALLBACK_H #define _CALLBACK_H #include<stdlib.h> #include<string.h> #include<iostream.h> #define CALLBACKLIST_INIT_SIZE 10 #define CALLBACKLIST_INCREMENT 5 class CallBack; typedef void *CallData;//回调数据指针类型定义 typedef void (CallBack::*CallBackFunction)(CallData); //指向回调成员函数的指针 typedef void (*CallBackStaticFunction)(CallData); //指向静态成员函数或普通函数的指针类型定义 class EventRecord{ private: char *eventName; //回调事件名称 CallBack *pointerToCBO;//指向回调对象的指针 //指向成员函数的指针和指向静态成员函数(或普通函数)指针的共用体 union{ CallBackFunction pointerToCBF; CallBackStaticFunction pointerToCBSF; }; public: EventRecord(void); //事件记录类的缺省构造函数 //构造包含成员函数的事件记录 EventRecord(char *ename,CallBack *pCBO,CallBackFunction pCBF); //构造包含静态成员函数或普通函数的事件记录 EventRecord(char *ename,CallBackStaticFunction pCBSF); ~EventRecord(void);//析构事件记录 void operator = (const EventRecord& er);//重载赋值运算符 //判断当前事件记录的事件名是否为ename int operator == (char *ename) const; //判断当前事件记录是否和指定事件记录相等 int operator == (const EventRecord& er) const; void Flush(void); //将当前事件记录清空 int IsEmpty(void) const;//判断事件记录是否为空(即事件名是否为空) friend class CallBack; //让CallBack类能访问EventRecord的私有成员; }; class CallBack { private: EventRecord *callBackList; //回调事件表 int curpos; //当前事件记录位置 int lastpos; //回调表中最后一空闲位置 int size; //回调表的大小 void MoveFirst(void) { curpos = 0; }//将当前记录置为第一条记录 void MoveNext(void) //将下一条记录置为当前记录 { if(curpos == lastpos) return; curpos++; } //判断回调表是否被遍历完 int EndOfList(void) const { return curpos == lastpos; } public: CallBack(void);//构造函数 CallBack(const CallBack& cb);//拷贝构造函数 ~CallBack(void);//析构函数 void operator = (const CallBack&am
|