さて、
今回触れますのは、
Visual Studio環境下でのみ動作する、特殊な機構
「
プロパティ」です。
プロパティといっても、Visual Studioの詳細設定をするとかそういうプロパティではありません。
アクセサをまとめて変数のように扱える仕組み
のことです。
例えば、以下のようなクラスがあったとします。
Test.h
class CTest{
public:
//_Valのアクセサ
int GetVal( void ){ return _Val; }
void SetVal( int Val_ ){ _Val = Val_; }
private:
int _Val;
}
|
カプセル化のため、
メンバ変数_Valを、プライベートメンバにしています。
そして、アクセサとして、
GetVal関数、SetVal関数を用意している感じです。
この_Valの値を操作するソースは以下です。
main.cpp
#include "Test.h"
int main(){
CTest test;
//代入
test.SetVal( 10 );
//取得
int a = test.GetVal();
//足し込み
test.SetVal( test.GetVal() + 1 );
//20倍に
test.SetVal( test.GetVal() * 20 );
return 1;
} |
見て分かると思いますが、
大変煩雑で読みづらいですね。
アクセサは、毎回「Set~」とか「Get~」とか書かなければならない分、冗長的で
しかも、ぱっと見でどういう計算をしているのかわかりにくいという問題点があります。
これを、プロパティ化してみましょう。
Test.h
class CTest{
public:
//_Valのアクセサ
__declspec( property( get = GetVal , put = SetVal ) ) int Val;
int GetVal( void ){ return _Val; }
void SetVal( int Val_ ){ _Val = Val_; }
private:
int _Val;
} |
この一文を追加するだけでOKです。
こうしておくと、クラス外では…
main.cpp
#include "Test.h"
int main(){
CTest test;
//代入
test.Val = 10;
//取得
int a = test.Val;
//足し込み
test.Val++;
//20倍に
test.Val *= 20;
return 1;
} |
このように、変数を呼び出すようにプログラムを書いていますが、
実は、
内部的には、関数が呼び出されています。
__declspecというのは、registerやstaticと同じ、ストレージクラスです。
ただし、このストレージクラスは、Visual Studioでのみ使用可能となります。
__declspecは、プロパティ以外にもさまざまな機能を持っています。
それは、追々書かせていただきます。
プロパティの構文としましては
__declspec( property( get = ゲッター関数名 , put = セッター関数名 ) ) 型名 プロパティ名;
です。
ゲッター、セッターどちらかを省略することも可能です。
「__declspecとか長くて書きたくねぇ!」
って人は
#define property( ... ) __declspec( property( __VA_ARGS__ ) )
と記述しておけば
property( get = ゲッター関数名 , put = セッター関数名 ) 型名 プロパティ名;
と書くだけでOKになります。
Visual Studioでのみの機能なのですが、
こちら側の開発環境を明記しておけば、企業様にも通じるはずなので、
ソースを見やすくする意味でもこう言ったものは活用するといいかもしれません。
そ~れ~で~は~(*´∀`)ノ
PR
COMMENT