忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

カプセル化のお供に、「プロパティ」

克兎です。
こんばんは。

新仮面ライダーの情報が出回っています。

ネタバレが苦手な人もいらっしゃると思いますので、
名前などは伏せておきますが、

新ライダーのデザイン、結構好きです( *´ω`* )

拍手[1回]


さて、
今回触れますのは、

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

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]