__property
C++ 拡張キーワード への移動
カテゴリ
説明
__property キーワードはクラスの属性を宣言します。プログラマには、プロパティはクラスの他の属性(フィールド)と同じように見えます。ただし、Object Pascal の該当機能と同様に、C++Builder の __property キーワードには、属性の値を検査し変更するだけではなく、もっと機能が追加されています。プロパティ属性によりプロパティへのアクセスが完全に制御されるので、クラスそのものの内部でプロパティを実装する方法に制限はありません。
構文
__property type propertyName [index1Type index1 ][indexNType indexN ] = { attributes };
ここで、各要素の意味は次のとおりです。
<型>
は組み込みデータ型または既に宣言されているデータ型です。<プロパティ名>
は任意の有効な識別子です。<インデックス N の型>
は組み込みデータ型または既に宣言されているデータ型です。<インデックス N>
は、プロパティの読み取り関数や書き込み関数に渡されるインデックス パラメータの名前です。<属性>
は、read、write、stored、index の一部または全部をこの順にコンマで区切って並べたものです。
角かっこ内の <インデックス N> パラメータは省略可能です。これらが指定された場合は、配列プロパティを宣言します。インデックス パラメータは配列プロパティの読み取りメソッドと書き込みメソッドに渡されます。
__property は VCL をサポートするために追加されたキーワードです。
以下は簡単なプロパティ宣言の例です。
class PropertyExample {
private:
int Fx, Fy;
float Fcells[100][100];
protected:
int readX() {
return (Fx);
}
void writeX(int newFx) {
Fx = newFx;
}
double computeZ() {
// Do some computation and return a floating-point value...
return (0.0);
}
float cellValue(int row, int col) {
return (Fcells[row][col]);
}
public:
__property int X = {read = readX, write = writeX};
__property int Y = {read = Fy};
__property double Z = {read = computeZ};
__property float Cells[int row][int col] = {read = cellValue};
};
上記の例では、プロパティ宣言をいくつか示しています。
- プロパティ X の読み取りと書き込みは、それぞれメンバ関数 readX と writeX を通じて行えます。
- プロパティ Y はメンバ変数 Fy に直接対応するもので、読み取り専用です。
- プロパティ Z は、計算で得られる読み取り専用値で、クラスにデータ メンバとして格納されません。
- Cells プロパティは、2 つのインデックスを持つ配列プロパティの例を示しています。
次の例では、ユーザー コードでこれらのプロパティにどうアクセスするかを示します。
// Previous code goes here
int main(int argc, char * argv[]) {
PropertyExample myPropertyExample ;
myPropertyExample.X = 42; // Evaluates to: myPropertyExample.WriteX(42) ;
int myVal1 = myPropertyExample.Y; // Evaluates to: myVal1 = myPropertyExample.Fy ;
double myVal2 = myPropertyExample.Z; // Evaluates to: myVal2 = myPropertyExample.ComputeZ() ;
float cellVal = myPropertyExample.Cells[3][7]; // Evaluates to : cellVal = myPropertyExample.cellValue(3,7);
}
プロパティには、他にも、この例には示されていない多くの種類や機能があります。
プロパティでは以下も可能です。
- インデックス属性を使って、同一の読み取りメソッドや書き込みメソッドを複数のプロパティに関連付けること。
- デフォルト値を持つこと。
- フォーム ファイルに格納されること。
- 基底クラスで定義されたプロパティを拡張すること。
コンパイラでのサポート
BCC32 コンパイラと macOS コンパイラでは、以下をサポートしていません。
- インデックス付きプロパティに対する
default
キーワードの使用。__property int Items[int I] = {read=GetItem/*, default*/};
__property int Items[int I] = {write=SetItem/*, default*/};
__property int Items[int I] = {read=GetItem, write=SetItem/*, default*/};
- 複合代入(Clang 拡張 C++ コンパイラとは異なる)。
詳細については、「__property:複合代入および連鎖代入」を参照してください。