| 网站首页 | 资讯 | Hack | 漏洞 | 网管 | 编程 | 培训 | 品黑页 | 软件 | 论坛 | 动画 | 视频 | 经典 | 教学站 | 黑客点睛 | 
免费服务 我要发布 在线破解 黑客游戏 精华收集 免费空间 网络硬盘 独家报道 黑器点播 免费 FTP 交换资源
收费服务 黑客培训 光盘刻录 黑客书籍 视频下载 主力频道 空间域名 网站建设 特色服务 解决方案 我要投诉
您现在的位置: 华夏黑客同盟 >> 编程 >> Vc >> 正文 用户登录 新用户注册
实例解析C++/CLI之代理与事件           ★★★ 【字体:
实例解析C++/CLI之代理与事件
作者:未知 文章来源:华盟收集 点击数: 更新时间:2008-7-20
  在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。

  例2:

using namespace System;
ref struct StrCompare
{
 static int CompareExact(String^ s1, String^ s2)
 {
  Console::WriteLine("Comparing {0} and {1} " "using CompareExact", s1, s2);
  // ...
  return 0;
 }
 static int CompareIgnoreCase(String^ s1, String^ s2)
 {
  Console::WriteLine("Comparing {0} and {1}" "using CompareIgnoreCase", s1, s2);
  // ...
  return 0;
 }
};
delegate int Compare(String^ s1, String^ s2);

/*1*/
Compare^ FindComparisonMethod()
{
 // ...
}
void Sort(Compare^ compare)
{
 int result;
 /*3*/ result = compare("Hello", "Hello");
 /*4*/ result = compare("Hello", "HELLO");
 /*5*/ result = compare("Hello", "Hell");
}
int main()
{
 /*6*/ Sort(gcnew Compare(&StrCompare::CompareIgnoreCase));
 /*7*/ Sort(FindComparisonMethod());
 /*8*/ FindComparisonMethod()("Red", "RED");
}

 

[1] [2] [3] [4] 下一页

责任编辑:华夏编辑6  联系方式  Email:华夏编辑6
电话:51228163
  • 上一篇编程:

  • 下一篇编程:
  • (只显示最新5条。评论内容只代表网友观点,与本站立场无关!)
    姓 名:
    * 游客填写  ·注册用户
    主 页:
    评 分:
    1分 2分 3分 4分 5分
    评论内容:
    验证码: *
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  • 最新hack更新
    最新推荐资讯
    相关编程
    C++技巧之二(MFC)
    C++技巧之一(MFC)
    C++ win32 downloader
    C++ Builder设计应用程序
    C++头文件的结构
    入门:C++下的引用类型
    C++指针使用的方法
    C++类的友元成员
    C++转向语句
    C/C++笔试题目大全下
    最新会员软件
    最新推荐视频
    最新推荐动画

    Copyright @ 2005 77169.Net Inc. All rights reserved. 华夏黑客同盟 版权所有
    北京市电信通提供网络带宽

    mailto:webmaster@77169.net
    咨询QQ号:836982 / 59280880
    联系站长 QQ38588913
    热线电话: 86-10-67634029/676229433
    京ICP证041431号