虽然用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;
}



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