快速业务通道

C++中建立对象间消息连接的一种系统方法

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
╪Ч╤тоС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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号