快速业务通道

深入C++ Builder之编写自己的元件-深入分析VCL继承、消息机制(3)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
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);

那么所有问题都解决了,它可以方便的透过对象直接访问成员函数,在所有的类中你都可以这样做:

class A
{
BDCallBack func;
Void DoSometing()
{
    …
    func(“Find it”,0);
}
};
class B
{
    Funcb()
    {
        A a;
        a.func=this.callback;
    }
    void __fastcall callback(String path,int type)
    {
    %

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号