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 マクロを作成。

#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++ パーマリンク