<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |