MS-C++ では __declspec(property()) でプロパティを作れるよ

__declspec(property())
http://blogs.wankuma.com/melt/archive/2007/03/12/66223.aspx
プロパティ (C++)
http://msdn.microsoft.com/ja-jp/library/yhfk0thd(v=vs.110).aspx

VC++2005 の頃からあったのですが、MS-C++の場合はプロパティを作れたのですね…なるほど。
__declspec(property())な構文を作れば、VB/C# のようにプロパティでアクセスできるという便利さ。これだと、Model を作る時に良さそうってことで、早速 PROPERTY マクロを作成。

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "stdafx.h"
#include <afxwin.h>
#include <iostream>
#include <string>
 
class Model
{
private:
    int _value;
public:
    __declspec(property(get=GetValue, put=SetValue)) int Value;
public:
    int GetValue() { return _value; }
    void SetValue( int value ) { _value = value; }
 
// マクロで定義する
#define PROPERTY( _t, _m )    \
private: _t m_##_m ;        \
public:                        \
    __declspec(property(get=get##_m, put=set##_m)) _t _m ;    \
    _t get##_m() { return m_##_m; }                        \
    void set##_m( _t value ) { m_##_m = value; };
 
public:
    PROPERTY( int, Number );
    PROPERTY( CString, Name );
    PROPERTY( double, Pressure );
    PROPERTY( std::string, MyName );
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    Model model;
    model.Value = 10;
 
    model.Name = L"masuda tomoaki";
    model.Number = 10;
    model.Pressure = 1.2f;
    model.MyName = "tomoaki";
 
    std::cout << "name: " << model.Name << std::endl
              << "num:  " << model.Number << std::endl;
    std::cout << "myname: " << model.MyName << std::endl;
 
    return 0;
}

このコードでは CString を cout しているときには文字化けしていますが、まぁ大抵のところはok。
これで、なんらかの形でプロパティ名とバインドさせれば、INotify を実装できるかな。

カテゴリー: C++ パーマリンク