通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
资源搜索:
热门搜索:Linux VB C语言 PhotoShop Flash TCP/IP
   首页 | 文章 | 软件 | 动画 | 资源 | 励志 | 骗术 | 论坛 | 邮箱 | 会员中心 | 军事 | 科技 | 博客 | 图片 | 商城 | 最新更新 | 800g资源 | 爱心黑客
您现在的位置: 爱国者黑客 >> 资源 >> 程序设计 >> C#语言 >> 数据库编程 >> 文章正文
在C++中实现属性
责任编辑:ncic   更新日期:2007-4-2

本文示例源代码下载

  开发测试环境:Visual C++ 7.0, Windows XP sp1, Windows 2000 sp3

  摘要

  本文试着在C++中不使用任何扩展技术模拟C#(或其他语言)中的属性特征。大多数在C++实现属性的库和编译器使用扩展技术,如Managed C++或C++ Builder,或者他们使用如通常函数的set和get方法,但那不是属性。

  详述

  我们首先看一下什么是属性。一个属性表现为一个字段或者成员变量,但它通过read和write方法或者get和set方法暗中操作变量。

  例如,若存在类A和它的属性Count,我可以写如下的代码:

A foo;
Cout << foo.Count;
实际上Count调用它的get函数返回当前的变量值。你可以将属性定为只读(你可以读取它但不能修改它)、只写或者可读写,这就是使用属性而不直接使用变量的的一个最大好处了。好了,让我们开始来实现它:

  我们需要能做如下的事:

int i = foo.Count; //--调用get函数得到值
foo.Count = i; //-- 调用set函数设定值
因此,很明显的我们需要重载''=''操作符使其能设定变量的值,同时也要重载该属性的返回值(在下面我们将会看到的)。

  我们将实现一个称为property的类,它做的就像一个属性,声明如下:

template <typename Container, typename ValueType, int nPropType>
class property {}
这个模板类表示的是我们的属性。Container是我们要在其中包含属性的类变量,set和get方法以及属性的类的类型。ValueType是内部变量即要定义的属性的类型,nPropType定义属性的读写标志:只读、只写或可读写。现在我们需要一个指向从包含属性的类Container到属性类property的set和get方法的指针,同时重载''=''操作符以使得属性能象变量起那样作用。现在我们来看property类的全部定义#define READ_ONLY 1
#define WRITE_ONLY 2
#define READ_WRITE 3
template <typename Container, typename ValueType, int nPropType>
class property
{
public:
property()
{
 m_cObject = NULL;
 Set = NULL;
 Get = NULL;
}
//-- 将m_cObject指向包含属性的container类 --
void setContainer(Container* cObject)
{
 m_cObject = cObject;
}
//-- 设定可改变属性值的set成员函数 --
void setter(void (Container::*pSet)(ValueType value))
{
 if((nPropType == WRITE_ONLY) || (nPropType == READ_WRITE))
  Set = pSet;
 else
  Set = NULL;
}
//-- 设定可检索属性值的get成员函数 --
void getter(ValueType (Container::*pGet)())
{
 if((nPropType == READ_ONLY) || (nPropType == READ_WRITE))
  Get = pGet;
 else
  Get = NULL;
}
//-- 重载''=''号操作符使其能用set成员设定属性值--
ValueType operator =(const ValueType& value)
{
 assert(m_cObject != NULL);
 assert(Set != NULL);
 (m_cObject->*Set)(value);
 return value;
}
//-- 使属性类能转换为内部类型成为可能--
operator ValueType()
{
 assert(m_cObject != NULL);
 assert(Get != NULL);
 return (m_cObject->*Get)();
}
private:
 Container* m_cObject; //-- 指向包含属性的类模块 --
 void (Container::*Set)(ValueType value);
             //-- 指向set成员函数的函数指针 --
 ValueType (Container::*Get)();
             //-- 指向get成员函数的函数指针 --
};
现在让我们来一段一段地看这些代码:

  • 上一篇文章:
  • 下一篇文章:
  • 热门文章
    Olldbg常见问题
    汇编语言的艺术(组合语言的艺术)--观
    汇编语言的艺术(组合语言的艺术)--准
    汇编语言的艺术(组合语言的艺术)--基
    汇编语言的艺术(组合语言的艺术)--基
    汇编语言---程式设计 (4)
    虚拟8086模式
    SYS命令使用说明
    javascript + CSS 实现动态菜单显
    推荐文章
    自制Windows XP SP2自动安装光盘
    SQLServer注入工具改进版 v1.02
    使用photoshop CS进行自然美肤
    Photoshop绘制诺基亚手机
    PHOTOSHOP制作秋日之梦
    PHOTOSHOP鼠绘名模王爱萍
    Photoshop制作晶莹飞溅的水珠
    教你用PHOTOSHOP做放大镜
    鼠绘美女及服装修画全过程