注:在本文中,不考虑对属性进行任何指针类操作,包括对属性进行取址(&操作符)、求值(*操作符)等,也未对类型为指针的属性进行过测试。(当然按原理来说使用类型为指针的属性应该也没问题)
万事开头难。首先我们来实现一个简单的包装器,也就是能实现缺省get/set函数的属性功能。由于在类的外部要像一个public成员使用,那么首先想到的便是proxy类了。set函数当然就是自定义的=操作符,而get函数就用自定义的类型转换来实现。想到了便做,于是第一个宏版本的属性实现代码如下:
#ifdef USE_PROPERTY
#define PropertyDef(TYPE,NAME) class Property##TYPE##NAME{
public:
Property##TYPE##NAME():v(TYPE())...{}
inline TYPE operator=(TYPE ac)...{v=ac;return v;}
inline operator TYPE()...{return v;}
private:
TYPE v;
};
Property##TYPE##NAME NAME;
#endif
要使用的话,把这段代码插入类的头文件,并在这段代码之前define USE_PROPERTY,就可以使用了。而要添加一个属性,在类的定义中加入一行PropertyDef(ProerttyType, (ProerttyName)即可。如要加入一个int类型的属性speed,就插入一行PropertyDef(int,speed)即可。而对于用户而言,就像speed就是一个公共的int成员使用即可。读取,改写均没问题。
回头看看这个实现,的确实现了缺省的get/set函数的功能,宏生成的嵌套类都是inline函数,几乎不影响效率(缺省的构造函数也可以去掉)。也就很明显的缺点,就是类内部要使用这个属性的话,要么还是通过get/set来访问,要么就要访问嵌套类的.v成员变量。(要这样做就要添加friend语句了。)另外,不能自定义get/set函数,也不能设置只读或只写属性。
(待续)
