当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:56:00  来源:本站整理

<b>实例解析C++/CLI之代理与事件</b>[VC/C++编程]

赞助商链接



  本文“<b>实例解析C++/CLI之代理与事件</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

C++/CLI中,代理是对函数举行包装的对象;而事件是一种为客户程序供应告诉的类机制.

在前几篇文章中,已经多次演示了假如让一个句柄在差别的时间,被引用至差别的对象,从而以更抽象的办法来办理程序中的问题,但是,也能利用代理通过函数来到达一样的效果;代理是包装了函数的一个对象,且对实例函数而言,也能通过特定的实例,与这些函数发生接洽.一旦一个代理包装了一个或多个函数,你就可以通过代理来调用这些函数,而无须事前理解包装了哪些函数.

请看例1中的代码,在标号1中,定义一个代理范例Del,由于利用了上下文关键字delegate,所以有点像函数的声明,但与函数声明差别的是,此处声明的是一个代理范例Del的实例,其可包装进肆意承受一个int范例作为参数并返回一个int值范例的函数(肆意有效的参数列表及返回范例组合都是答应的).一旦定义了某种代理范例,它只能被用于包装具有一样范例的函数;代理范例可被定义在源文件中或命名空间的范围内,也能定义在类中,并可有public或private拜候掌握属性.

例1:

using namespace System;
ref struct A
{
  static int Square(int i)
  {
   return i * i;
  }
};
ref struct B
{
  int Cube(int i)
  {
   return i * i * i;
  }
};
/*1*/
delegate int Del(int value);
int main()
{
  /*2*/ Del^ d = gcnew Del(&A::Square);
  /*3*/ Console::WriteLine("d(10) result = {0}", d(10));
  /*4*/ B^ b = gcnew B;
  /*5*/ d = gcnew Del(b, &B::Cube);
  /*6*/ Console::WriteLine("d(10) result = {0}", d(10));
}

静态函数A::Square与实例函数B::Cube对Del来说,都具有相同的参数范例及返回范例,因此它们能被包装进同范例的代理中.注意,即便两个函数均为public,当考虑它们与Del的兼容性时,它们的可拜候性也是不相关的,这样的函数也能被定义在相同或差别的类中,主要由程序员来挑选.

一旦定义了某种代理范例,便可成立此范例实例的句柄,并举行初始化或赋值操作,如标号2中所示的静态函数A::Square,及标号5中所示的实例函数B::Cube.(此处只是出于演示的目的,不然把Cube做成实例函数没有任何好处.)

成立一个代理实例触及到调用一个构造函数,假如是在包装一个静态函数,只需传送进一个指向成员函数的指针;而对实例函数而言,必须传送两个参数:一个实例的句柄及指向实例成员函数的指针.

在初始化代理实例之后,就可以间接地调用它们包装的函数了,用法与直接调用原函数一样,只不过目前用的是代理实例名,如标号3与6,由包装函数返回的值也是像直接调用函数时那样得到.假如一个代理实例的值为nullptr,此时再试图调用被包装的函数,会招致System::NullReferenceException范例非常.

以下是输出:

d(10) result = 100
d(10) result = 1000

传送与返回代理

有时,把包装好的函数传送给另一个函数,会非常有效,承受一方的函数并不知道会传送过来哪个函数,并且它也无须关心,只需简单地通过包装好的代理,间接调用此函数就行了.

下面以调集合元素排序来阐明,大大都时刻,调集合元素排序所根据的法则,只在对某对元素举行对比的办法上存在辨别.假如在运行时供应举行对比的函数,一个排序历程就可以用呼应定义的对比函数排出肆意的次序,请看例2.


  以上是“<b>实例解析C++/CLI之代理与事件</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .