一般来说对于标准C++而言是不存在成员属性这个概念的,以前大家都是用GetXXX/SetXXX来访问或取得数据,好象也没有感觉到任何不便。但是当我们用过C#之类的语言之后,我们总觉得C++这个方式太老土了。于是我们想去实现“属性”这个C++语言缺乏的要素。事实上网络上有很多人已经做了这部分工作,实现的方法有很多种,一种是用模板,一种是根据特定语言来写的,如VC(指的是Microsoft实现的C++)。但是它们要么很复杂,要么很难记住它的准确用法,嗯我总是喜欢简单的东西,因为太复杂的东东会让我的头脑当机。废话少说,来看看如何实现。
在实现之前,我必需先探讨一下为什么需要“属性”这个东东。比如说下面雇员这个类:
class CEmployee { public: int Old; //年龄 }; CEmployee employee; employee.Old=22; int old =employee.Old; |
CEmployee employee; employee.SetOld(22); int old =employee.GetOld(); |
class CEmployee int GetOld(void) |
public class CEmployee { private int m_old; public int Old { get { return m_old; } set { if(value >0 && value <60) { m_old = value; } else { m_old =20; } } } } |
#define PROP(T,X) __declspec(property(get= __get##X,put= __put##X))T X; #define GETPROP(T,X) __declspec(property(get= __get##X))T X; //只读属性 #define SETPROP(T,X) __declspec(property(put= __put##X))T X; //只写属必 #define GET(T,X) T __get##X(void) #define SET(T,X) void __put##X(T value) |
class CEmployee { private: int m_old; public: PROP(int ,Old) GET(int,Old) { return m_old; } SET(int,Old) { if( (value >0) && (value <60)) //这里的value你可把它和C#一样当做关键字 { m_old = value; } else { m_old =20; } } }; |