游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4314|回复: 3

呼叫任意非static成员函数

[复制链接]

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2006-9-1 02:27:00 | 显示全部楼层 |阅读模式
我们都知道不可以将一个函数指针指向一个未知类中的非静态成员函数。

虽然一些stl中提供了memfun,以及一些slot都提供了解决主案,但都不是很完美。有一些需要将函数类型在基类中全部定义出来,有一些需要在每个函数指针赋值时自行写上强制转换,十分麻烦。

而在《古月》的GUI中,大量使用了Borland所特有的__closure关键字。而这个关键字的用处便是可以定义一个指向任意类成员函数的函数指针。

由于在标准C/C++并无这一定义,而Visual C/C++所定义的特别关键字又不对一般程序开放(如使用会被告之是内部关键字,不可用)。

《古月》v18.LR-25/26将提供一种通过汇编与模板组合的实现方式,来支持这种设计。由于这些代码是模板形式存在的,所以在等新版《古月》发布后,大家可以轻易的拆出使用在自己的程序上。

这里提供一段示例:

class _Object{};  //真的就是这样空的,不需要任意内容

#ifdef __BORLANDC__

        #define        SetEventCall(event_obj,event_func)                                event_obj=event_func
        #define CallEvent(event_obj)                                                    event_obj
        #define DefineEvent(name,result,intro)                                    result (__closure *name)intro

#else
............//Visual C/C++代码暂时不公布
#endif//__BORLANDC__


class Button
{
public:
    DefineEvent(OnButtonClick,void,(Button *,int));   
  //void (__closure *OnButtonClick)(Button *,int);   //Borland C/C++版实质代码

        void TestButtonClick()
        {
                CallEvent(OnButtonClick)(this,0);
                //OnButtonClick(this,0);        //Borland C/C++版实质代码
        }

        Button()
        {
                printf("Button this=%p\n",this);
        }
}

class Test:public _Object
{
        Button *button;

        void OnClick(Button *but)
        {
                printf("Test::OnClick,this=%p,but=%p\n",this,but);
        };

        Test()
        {
                printf("Test this=%p\n",this);

                button=new Button;

                SetEventCall(button->OnButtonClick,OnButtonClick);
                //button->OnButtonClick=OnButtonClick;    //Borland C/C++版实质代码

                button->TestButtonClick();
        }
};


为了保持BC/VC都可以编译,所以未来将会以这种方式出现原本__closure关键字的使用方式。

64

主题

146

帖子

146

积分

注册会员

Rank: 2

积分
146
发表于 2006-9-1 06:35:00 | 显示全部楼层

Re:呼叫任意非static成员函数

那么在 Turbo C++ 2006 是否也会有原生态的 __closure 呢?

54

主题

2918

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2006-9-1 11:11:00 | 显示全部楼层

Re:呼叫任意非static成员函数

什么!还有“Turbo C++ 2006 ”?
什么样子的?我正好对VC2005的编译很不满呢,有意找个新鲜的。

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
 楼主| 发表于 2006-9-1 11:20:00 | 显示全部楼层

Re:呼叫任意非static成员函数

Turbo C++ 2006支持Borland C++ 2006 + update4的所有特性,包括__closure,__property等
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-7 12:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表