• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

在C++中利用模板实现 data variant(propery)

发布: 2008-6-04 13:54 | 作者: 不详 | 来源: CSDN | 查看: 108次 | 进入软件测试论坛讨论

领测软件测试网 关键字:C++ 模板 data variant propery

介绍在C++中利用模板来实现对象Property的方法。这个方法在Linux下用g++编译调试通过。但未在正式的工程中使用过。还请大家多提意见。
       在C++Builder, 可以通过CB的扩展语法__property()来实现对象的Property。但这个方法必需有编译器的支持,脱离了CB的编译环境就无法使用。同样的,在VC6.0以上的版本中,也实现了__declspec(property)这样一个语法来实现property.它除了跟CB 中的perperty一样,在跨平台方面有局限性以外,而且他不支持多态。 下面的例子可以说明: class M
   {
 private:
  int v;
  virtual int Get()
  {
   return v;
  }
  virtual void Set(int x)
  {
   v = x;
  }
 public:
   __declspec(property(get=Get,put=Set)) int XValue;
   };   class MM : public M
   {
 virtual int Get()
        {
  return v+3;
 }
 virtual void Set(int x)
 {
  v = x -3;
 }
   };   MM m;
   m.XValue = 3; //实际上调用的是M::Set(),而不是MM::Set()
   int v = m.XValue; //实际上调用的是M::Get(), 而不是MM:Get();
   为什么呢?因为在编译器进行编译的时候,已经将这个property跟 M::Get(),M::Set()邦定在了一起。      鉴于上面所述,我们提出我们目标:      1. 要实现Property,并且不依赖于某一个开发平台,只要是当前流行的C++编译器都可以编译通过。      2. 必须使这种Property的实现方法符合OOP的法则。      只有达到以上两点,才能使我们的方法有实用性。      下面我们利用C++的模板方法来实现Property. 这个方法未必是最好的,而且在实际使用的时候还会是有问题的。但也算是学习一下C++的Template了。      首先来看看Property的基本实现原理。在C++语法中,是没有Property这样的语法的。在C++中,Property就相当于类成员变量,我们可以把成员变量暴露在Public域,这样我们可以任意操作他,而不用很麻烦的去调用某一个操作函数(看上去就象在VB中操作对象的Property一样)。但实际上这是一种很不安全的方法,因为我们失去了对这个成员变量的控制,那将会发生很多意料不到的事情。 因此在C++中,Property的实现都是通过成员函数来模拟实现的。比如:      class A    {        private:              int x;         public:              void get_X(int& v);              void put_X(int v);            }      类A中的成员函数X,就是通过get_X()和put_X()这两个函数来实现访问的。这将保证变量x尽量的处于我们的保护之中(可以在get_X,put_X中写入我们对x的保护代码)。
     那么能否通过某一种方法,来隐藏对get_和put_函数的调用,而类似于:     A.X_Value = 3; //其实是间接调用A.put_X(3)     int a = A.X_Value; //其实是间接调用A.get_X();这样的语法呢?     可以通过C++的模板技术来实现。要实现这样的语法,我们需要一个代理模板类, 在这个模板类中,我们重载操作符"=", 在这个重载的operator =()函数中,我们调用宿主对象的put_X()函数,把值传入. 然后我们还要重载属性值类型的操作符, 比如属性值的类型是 string ,则我们要重载一个叫string的操作符, 并在 operator string()中调用宿主对象的get_X()函数,把值传出去.

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

TAG: 模板 data propery variant

31/3123>

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网