CodeGear C++Builder の property

気になったので CodeGear C++Builder 2007 で試してみました。

// THoge.hpp
#ifndef THogeHPP
#define THogeHPP
class THoge
{
private:
  int f_count;
  void set_count(int n);
  int get_count();
public:
  THoge();
  ~THoge();
  void doSomething();
  // __property int count = {read = f_count, write = f_count};
  __property int count = {read = get_count, write = set_count};
};
#endif
// THoge.cpp
#include "THoge.hpp"
THoge::THoge()
{
  f_count = 0;
}
THoge::~THoge()
{
  //
}
void THoge::doSomething()
{
  f_count ++;
}
void THoge::set_count(int n)
{
  f_count = n;
}
int THoge::get_count()
{
  return f_count;
}
// Unit1.h
// (omitted)
private:	// ユーザー宣言
  THoge *hoge;
// (omitted)
// Unit1.cpp
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
  hoge = new THoge();
  hoge->count = 100;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  hoge->doSomething();
  int c = hoge->count;
  AnsiString s;
  s.sprintf("hoge %d", c);
  Edit1->Text = s;  
}

というようなものがちゃんと動きました。

__property という予約語は自分で勝手に作ったクラスで使える、ということのようです。Visual C++ の CLI でも property が使えるそうですが、CodeGear だと .NET じゃない Win32 でこれが使えるわけですね。

THoge クラスで予約語 __published: を使おうとしたらコンパイルエラーになったので、こちらは VCL 関連のクラスを継承していないとダメみたいです。

CodeGear RAD Studio の Help にはほとんど書かれていない C++ の property 拡張ですが、ここに説明がありました: