Ansi C++ keyword extensions implemented in C++ builder

虽然用C++builder也好长时间了,但从来没有思考,为什么要实现非标准的关键字。

前两天看到一则讨论,说是否要在Java里面加入Closure,跟帖的人里面就有人拿C++Builder来举例。于是我翻翻C++Builder的帮助,看到了下面四个扩展关键字。

__classid,主要是用来通过类名获取类的TMetaClass,而TMetaClass是某个C++类在Object Pascal中的表现形式,因为C++Builder是架构在Object Pascal上的。这个关键字用得最多的地方,莫过于当要创建一个窗体的时候了,Application->CreateForm()的第一个参数,一般都是__classid(TSomeForm)的形式。

 __closure,主要用来定义一个类的成员函数的类型。有了__closure定义的类成员函数,就可以被赋值给另一个类中定义的函数指针变量。听起来有点拗口,实际上就是C++Builder中各个组件所具有的事件的实现方式。自己封装过组建的程序员对此应该非常熟悉。

 __property,这个也许是实际写代码用的最多的了。用来定义一个类的属性,其实在JAVA和C#中都有属性的概念,而且实现起来非常容易。尽管C++Builder把它扩充了,但写起代码来还是稍显繁琐。

__published,没什么好说的,用来定义一个在IDE环境中通过OBJECT INSPECTOR显示出来的类成员。

如果__property的实现手法再简洁一点(像C#那样),就完美了。不知道C++标准组织会不会在未来发布新版C++时,考虑加入这些特性。

——–
附一个bcb中__closure用法的示例:

typedef void __fastcall (__closure*THelloEvent)(char*);class TMyObject
{
private:
  THelloEvent m_OnHello;
protected:

public:
  TMyObject() { }
  ~TMyObject() { }
  void SetHello(THelloEvent handler) { m_OnHello = handler; }
  THelloEvent GetHello() { return m_OnHello; }
  virtual void ExecuteHello(char* msg) { m_OnHello(msg); }
};

class TMyComponent
{
private:
  TMyObject* m_Object;
public:
  TMyComponent() { m_Object = new TMyObject(); }
  ~TMyComponent() { delete m_Object; }
  void __fastcall SayHi(char* msg) { cout << msg << endl; }
  void ChangeFun() { m_Object->SetHello(SayHi); }
  TMyObject* GetObject() { return m_Object; }
};

int main(int argc, char* argv[])
{
  TMyComponent d;
  d.ChangeFun();
  d.GetObject()->ExecuteHello("Hi, world");
  system("pause");
  return 0;
}

1 Comment »

  1. Idetrorce said

    very interesting, but I don’t agree with you
    Idetrorce

RSS feed for comments on this post · TrackBack URI

Leave a Comment