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是结束属性声明.