在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函数,也不能设置只读或只写属性。
(待续)
注:在本文中,不考虑对属性进行任何指针类操作,包括对属性进行取址(&操作符)、求值(*操作符)等,也未对类型为指针的属性进行过测试。(当然按原理来说使用类型为指针的属性应该也没问题)
万事开头难。首先我们来实现一个简单的包装器,也就是能实现缺省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#中的属性(Property)功能的尝试: MACRO篇(2)
- c#中实现c/c++的__Line__和__FILE__功能
- C#中能实现同样功能的方法或属性的区别
- .Net/C# 实现真正的只读属性 (ReadOnly Property)
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
- .Net/C# 实现真正的只读的 Hashtable 类型的属性 (ReadOnly Hashtable Property)
- C++中实现C#属性相似的语法
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
- C也可以通过精心封装某些函数功能实现重用,那C++的类有什么优点吗(从面向对象的三大属性进行分析)
- 用C++实现类似C#属性
- 在C++中实现类似C#的字符串格式功能
- C++实现C#的get,set属性操作
- C#+AE 实现点击查询属性功能
- c++利用指针实现C#字典的功能
- c#控件实现类似c++中ocx控件功能,Event事件
- 在C++中实现“属性 (Property)”
- C# 能否实现像枚举一样自反射元数据属性的功能。
- C++中的property库的设计与实现过程(五)(第一部完)——为属性加入访问控制
- C#+AE 实现点击查询属性功能
- 在C++中实现“属性 (Property)”