动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.gcc manual page (一).
.使用Microsoft Agent的COM接口编.
.如何在C/C++中调用Java.
.自己对三层架构理论的理解.
.实现关机时的效果的一段代码.
.C++ 中重载 + 操作符的正确方法.
.编程者说之C语言.
.如何修改自定义Webpart 的标题(d.
.VC++实现COM事件接收器.
.递归下降纯解释器编写的困惑.
.C编写Windows服务程序的五个步骤.
.任意形状的窗体.
.《C++编程规范》笔记(设计风格).
.C++对象布局及多态之虚成员函数调.
.用HOOK函数自动关闭IE广告窗口.
.学习C++的最大难度是什么?.
.References and arrays.
..
.巧算星期几.
.庆祝20岁生日: C++图书热点观察.

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

发表日期:2008-3-8 |



  用过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类,在对象间建立消息连接已变为一项很简单和美丽的工作。


由于笔者水平有限,该类的设计必
上一篇:C++中将DBGrid中的数据导出到Word和Excel 人气:346
下一篇:C++中获取WinNT/Win2k当前用户名和密码 人气:510
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号