当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 在C++中实现属性

VC++
面试题目:猫吃老鼠问题的求解
一个最基本的有限元计算程序
简单的表达式求值
C程序移植到VC开发环境下
一个小语言的词法分析程序
A/B 向上取整的方法
马走日棋盘算法
一种随机抽题的简单算法
clone模式在平衡排序二叉树实现中的应用
递归的应用 -- 最简单分形图形实现
比较数据排序前后的查找次数
根据前序和中序序列生成二叉树
如何用CZip/CUnzip类压缩/解压缩文件
使用 random_shuffle() 算法随机化序列元素
Ceb解除打印屏蔽实战
基于SHA-256的HMAC文件校验器
模拟信息加密流程图简介
关于数据校验
浅谈利用RSA算法防止非法注册机的制作
加密它:用新的高级加密标准(AES)保持你的数据安全

VC++ 中的 在C++中实现属性


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 66 ::
收藏到网摘: n/a

在C++中实现属性
原作:Emad Barsoum 翻译:虞振祥

下载本文示例源代码

本文译自http://www.codeguru.com/cpp_mfc/Property.html的Implementing a Property in C++

开发测试环境: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 3template <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成员函数的函数指针 --};
现在让我们来一段一段地看这些代码:
在下面的代码中,仅仅将Container指针指向一个有效的包含属性的实例。
void setContainer(Container* cObject){ m_cObject = cObject;}
下面的代码,设定指针指向包含属性的类中的set和get成员函数,其set和get成员函数度有,唯一的限制即set成员函数必须有一个ValueType型的参数并无返回值,get成员函数没有参数,但要返回ValueType型值。
//-- 设定可改变属性值的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 =