深入C++ Builder之编写自己的元件-深入分析VCL继承、消息机制(3)
def void __fastcall (__closure *TShapeSelectedEvent)(TObject* Sender,int Index);
是否还记得上面的代码? 大概来说那是函数指针的申明,对于初学者来说,上面的申明真的很晦涩,我来解释一下:THoverShapeEvent是一个函数指针,该函数的返回值是void , 调用类型是__fastcall,有2个行参,分别是TObject*和int,关键在于红色的__closure关键字,什么意思? 在BCB的帮助我我找到了如下说明: The keyword __closure was added to support the VCL and is used when declaring event handler functions. 就是如此简单,几乎没有提供任何信息,只知道__closure提供对事件处理函数的支持,下面我来详细介绍一下: 不知道你有没有写过这样的代码: 我们设计了一个类,比如遍历磁盘,有一个数据成员是回调函数指针,当我们遍历磁盘的的函数找到了一个文件时调用这个回调函数,通常情况下,我们这个回调函数需要申明在类的外面,那么还是指针需要这样申明: typedef void __fastcall (*BDCallBack)(String path,int type); 但是这显然不符合OO设计原则,如果你想把一个类的成员函数指定为这个成员函数,那么你将需要这样申明: typedef void __fastcall (base::* BDCallBack)(String path,int type); 同时你需要这样赋值: BDCallBack m=&bass::func; 语法越来越晦涩了,这还不是最重要的,如果有很多类的成员函数都需要指定为回调函数呢?你需要为每一个类申明一个类似的函数指针,我想你已经崩溃了。 __closure这个时候就有用武之地了,如果你这样申明: typedef void __fastcall (__closure *BDCallBack)(String path,int type); 那么所有问题都解决了,它可以方便的透过对象直接访问成员函数,在所有的类中你都可以这样做:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |