english version:http://www.codeguru.com/cpp/cpp/algorithms/general/article.php/c13039/#more
当我使用C#的属性编程的时候, 我考虑到为什么C++不具有这样的特点呢. 这是一个具有挑战的问题, 因为我知道对于C++开发者来说,这是一个非常重要的的事情! 我花了3天时间来写这篇文章, 希望你会发现这是有用的.说
什么是属性?
属性就像存储数据的变量,但当从属性中读写数据时他们就会触发事件. 换句话说, 一个属性就是一个交互的变量,可以自己进化,而且在读取他们的时候可以有不同的值.
对于C#来说,写一个具有属性的类是非常简单的,但对于C++来说,这看起来是不可能的,因为编译器不支持像C#那样的属性. 为了解决这个问题,我写这篇文章去解释如何使C++类使其具有类似C#一样的属性.
你将会理解如何使用宏(macro)去声明和实现属性. 如果你是一个C++方面的专家那么你需要了解这是如何工作的.
为什么属性重要?
假设你需要写一个代表人的对象, 这个对象包含如下数据:
Full Name, Age, Year of birth, Gendar
用C++带入,书写属下:
class Person{
public :
Person(){}
virtual ~person(){}
private :
char m_fName[20];
char m_lName[20];
UINT m_YearOfBirth;
bool m_bGendar;
};
注意: 在大部分情况下, 你不能够定义具有公共属性的变量, 因为他们可以被直接访问. 数据一般需要经过逻辑处理以后才能够被访问.
如果你需要对m_bGendar赋值,那么你需要实现如下方法:
class Person{
public :
Person(){}
virtual ~person(){}
void SetGendar(bool bGendar){m_bGendar=bGendar;}
bool GetGendar()}{return m_bGendar;}
private :
char m_fName[20];
char m_lName[20];
UINT m_YearOfBirth;
bool m_bGendar;
};
使用这种方法的缺点是你需要知道修改变量的对应的方法. 而使用属性, 那么做这样的事情只需要知道你需要修改的变量的名字即可, 这样岂不更简单?!. 而且, 单个属性可以支持不同的数据类型. 我们以上面的为例, 如果你想让Gendar 接受string 和Boolean赋值,那么可以如下操作:
Person.Gendar ="Male";
or
Person.Gendar = true;
当然, 使用属性,代码更具有可读性.
属性声明
现在, 我将会告诉你如何写属性. 以Gendar为例,
class Person{
public:
Person(){}
virtual ~Person(){}
Begin_Property(char*,Gender)
_get(char*,Gender)
_set(char *);
_get(bool)
_set(bool);
_release(Gender)End_Property(Gender)
private :
char m_fName[20];
char m_lName[20];
UINT m_YearOfBirth;
bool m_bGendar;
}
现在,我们看看代码,我用 Begin_Property宏来定义属性, 它接受2个参数, 属性的数据类型和属性的名字.因为Gendaer是字符类型, 它应当被声明为char*. 定义属性后, 需要声明get and set 事件. _get 和 _set是两个能够接受一个参数的宏,尽管Gendar变量是char*类型的,但它可以接受string or Boolean的变量赋值.
最后2个宏, _release 是释放其分配的内存的, End_Property是结束属性声明.