您的位置:首页 > 编程语言 > C语言/C++

在C++实现C#中的属性(Property)功能的尝试: MACRO篇(1)

2007-08-29 22:55 627 查看
看了C++ templates一书以后,想用C++模拟实现C#中的属性功能。即对象的某个值可以当成public成员变量一样使用,但实际上值的获取和更改是经过对应获取和设置器(get和set函数)来进行的。当然,原本是想用template来实现,当实现中遇到很多很多问题,目前先用C++的宏来实现了基本功能。
注:在本文中,不考虑对属性进行任何指针类操作,包括对属性进行取址(&操作符)、求值(*操作符)等,也未对类型为指针的属性进行过测试。(当然按原理来说使用类型为指针的属性应该也没问题)

万事开头难。首先我们来实现一个简单的包装器,也就是能实现缺省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函数,也不能设置只读或只写属性。 

(待续)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ c# templates 测试 c