网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 网络学院 >> 程序设计 >> VC编程 >> 文章正文
  在C++实现C#中的属性(Property)功能的尝试: MACRO篇(1)            【字体:
在C++实现C#中的属性(Property)功能的尝试: MACRO篇(1)
作者:佚名    文章来源:不详    点击数:    更新时间:2007-9-12    

看了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函数,也不能设置只读或只写属性。 

(待续)




本文来源:http://blog.csdn.net/purewinter/archive/2007/08/29/1764561.aspx
站内文章搜索 高级搜索
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
     directx 图形接口指南(…
     win2k下的api函数的拦截
     用crypto  api  实现公钥…
     根据别人的md5源码封装的…
     vc中使用gdi+合并jpg图片
     document/view的交互 --…
     windows下的函数hook技术
     windows api函数大全一
     用vc 6.0实现串行通信的…
     vc++技术内幕(第四版)…
  • Java Swing实现俄罗斯方块

  • 开发手记---JAVA数据库连接池

  • 设计模式之--Bridge

  • JAVA 应用简单破解---类库提…

  • java现状----编程使用的语言…

  • genexus中对字符串的格式补空…

  • SIP简介,第2部分:SIP SERV…

  • struts异常_does not start …

  • 关于Linux下C/C++程序编译

  • c++ 09 :一览未来

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    网络学院©2007 www.23book.net
    为您提供web编程,vb编程,vc编程,服务器架设管理,数据库设计等方面的知识 站长:David