您的位置广东网盟 > 文章资讯 > 软件应用 > 编程开发 > VC/VC++ > 文章内容

轻松使用C++深入研究.NET委托与事件设计

作者:佚名  来源:不详  发布时间:2008-7-30 21:39:03

  简介

  类型安全机制的实现原来采用的是C风格的回调(callback)函数,而.NET Framework引入了委托和事件来替代原来的方式;它们被广泛地使用。我们在这里尝试使用标准C++来实现与之类似的功能,这样我们不但可以对这些概念有一个更好的认识,而且同时还能够体验C++的一些有趣的技术。  C#中的委托与事件关键字

  首先我们来看一个简单的C#程序(下面的代码略有删节)。执行程序的输出结果如下显示:

  SimpleDelegateFunction called from Ob1,

  string=Event fired!

  Event fired!(Ob1): 3:49:46 PM on

  Friday, May 10, 2002

  Event fired!(Ob1): 1056318417

  SimpleDelegateFunction called from Ob2,

  string=Event fired!

  Event fired!(Ob2): 3:49:46 PM on

  Friday, May 10, 2002

  Event fired!(Ob2): 1056318417

  所有这些都源于这样一行代码:dae.FirePrintString("Event fired!");

  在利用C++来实现这些功能时,我模仿了C#的语法并完全按照功能的要求进行开发。

  namespace DelegatesAndEvents

  {

  class DelegatesAndEvents

  {

  public delegate void PrintString(string s);

  public event PrintString MyPrintString;

  public void FirePrintString(string s)

  {

  if (MyPrintString != null)MyPrintString(s);

  }

  }

  class TestDelegatesAndEvents

  {

  [STAThread]

  static void Main(string[] args)

  {

  DelegatesAndEvents dae =new DelegatesAndEvents();

  MyDelegates d = new MyDelegates();

  d.Name = "Ob1";

  dae.MyPrintString +=new DelegatesAndEvents.PrintString(d.SimpleDelegateFunction);

  // ... more code similar to the

  // above few lines ...

  dae.FirePrintString("Event fired!");

  }

  }

  class MyDelegates

  {

  // ... "Name" property omitted...

  public void SimpleDelegateFunction(string s)

  {

  Console.WriteLine("SimpleDelegateFunction called from {0}, string={1}", m_name, s);

  }

  // ... more methods ...

  }

  }

  C++中的类型安全函数指针

  对于“老式方法”的批判之一便是它们不是类型安全的[1]。下面的代码证明了这个观点:

  typedef size_t (*FUNC)(const char*);


  美女啦啦队招募中   纵情享受人生第一乐趣  
 新浪招商引资征代理商   上网实用手册 
 
 
  void printSize(const char* str) {

  FUNC f = strlen;

  (void) printf("%s is %ld chars\n", str, f(str));

  }

  void crashAndBurn(const char* str) {

  FUNC f = reinterpret_cast<FUNC>(strcat);

  f(str);

  }

  代码在[2]中可以找到。当然,在你使用reinterpret_cast的时候,你可能会遇到麻烦。如果你将强制转换(cast)去掉,C++编译器将报错,而相对来说更为安全的static_cast也不能够完成转换。这个例子也有点像比较苹果和橙子,因为在C#中万事万物皆对象,而reinterpret_cast就相当于一种解决方式。下面的这个C++程序示例将会采取使用成员函数指针的方法来避免使用reinterpret_cast:

  struct Object { };

  struct Str : public Object {

  size_t Len(const char* str) {

  return strlen(str);

  }

  char* Cat(char* s1, const char* s2) {

  return strcat(s1, s2);

  }

  };

  typedef size_t (Object::*FUNC)(const char*);

  void printSize(const char* s) {

  Str str;

  FUNC f = static_cast<FUNC>(&Str::Len);

  (void) printf("%s is %ld chars\n", s, (str.*f)(s));

  }

  void crashAndBurn(const char* s) {

  Str str;

  FUNC f = static_cast<FUNC>(&Str::Cat);

  (str.*f)(s);

  }

  static_cast运算符将转化Str::Len函数指针,因为Str是由Object派生来的,但是Str::Cat是类型安全的,它不能被转换,因为函数签名是不匹配的。

  成员函数指针的工作机制与常规的函数指针是非常相似的;唯一不同(除了更为复杂的语法外)的是你需要一个用来调用成员函数的类的实例。当然,我们也可以使用->*运算符来用指向类实例的指针完成对成员函数的调用。

  Str* pStr = new Str();

  FUNC f = static_cast<FUNC>(&Str::Len);

  (void) printf("%s is %ld chars\n", s, (str->*f)(s));

  delete pStr;

  只要所有的类是从基类Object派生来的(C#中就是这样),你就可以使用C++来创建类型安全的成员函数指针。

 
Tags:广东网盟  
  •         用户名: 验证码: 验证码,看不清楚请点击刷新验证码 (注“”为必填内容。)


    文章评论: [ 查看全部 ] 网友评论
    网盟推荐文章
    · 计算机主板工作原理
    · 如何制作漂亮的Excel表格
    · Linux实战之NFS服务器图形化配置
    · ARP攻击专家介绍切断传播途径六招
    · IP反向追踪技术的关键技术及实现方法
    · 服务器安全访问帐号设置要点
    · 实战照片打印机选购
    · Windows系统的超级帐户SYSTEM
    · 服务器上为员工开私有空间的方法
    · Windows Server 2003 FTP Server进阶架
    · 网络打印机共享方法
    · GHOST系统的安装方法介绍二
    · GHOST系统的安装方法介绍一
    · 锐腾无盘系统使用设置详解
    · 《Windows系统网络工具使用手册》
    · 各种ADSL路由器端口映射设置
    · 网吧电影视频服务器架设完全入门教程
    · Intel整合CPU明年如期发布
    · 网吧的不二选择,福晶外设劲舞英雄套装
    · 多服务器无盘网吧解决方案
    网盟热门文章
    · 卡巴斯基8.0最新试用版
    · 深圳华强北最大电脑公司高薪招聘2000-
    · 急招服务型网管(深圳罗湖)
    · XP母盘制作详细介绍
    · 广州一网吧急招网管(多名)
    · 如果程序老提示错误,弹出类似以下错误
    · 广州荔湾网吧急诚聘(见习网管.网管)
    · 广州大型网吧招聘技术员
    · 全国各省电信及网通DNS列表
    · 网吧客户机系统安装详解
    · 深圳市布吉街道E度空间网吧招聘普通网
    · 广东东莞黄江网吧招网管数名!
    · 广州海珠区网吧招聘人员(服务员、收银
    · 网吧网管系统安装维护经验谈
    · 东莞大型网吧招技术主管
    · 广州市电脑城招技术员1名和门市销售5名
    · 锐起2046详细安装图解教程
    · 东莞塘厦枫叶网吧招网管数名
    · 东莞常平金鼎网吧急招网管服务员
    · 神舟低价的秘密!我在神舟的日子(一个
    关于网盟 | 网站帮助 | 广告合作 | 下载声明 | 友情连接 | 联系方式

    Copyright © 2003-2008 Gdwg.Net. All Rights Reserved .
    中国广东网管联盟设计维护.网站备案:粤ICP备08020875号