资源类型:rar文件
资源标签:综合系统类
资源大小:17.39KB
更新时间:2010-03-14
下载次数:11次
在c++中实现属性
在c++中实现属性概况
在c++中实现属性介绍
在C++中实现属性
本文译自http://www.codeguru.com/cpp_mfc/Property.html的Implementing a Property in C++
以下是译文
本文由Emad Barsoum投稿。
开发测试环境: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 *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 = NULL;
}
在如下的代码中,第一部分是 = 操作符的重载,它调用包含属性的类中的set函数设定其属性的值。第二部分则为了使整个属性类象ValueType类型一样起作用,所以它返回包含属性的类中get函数的返回值。
//-- 重载 = 号操作符使其能用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)();
}
现在我们来看看怎样使用它:
如下所示,在PropTest类中定义了一个叫做Count的简单属性。Count的实际值将保存到或检索之在PropTest的私有成员变量"m_nCount"中,通过PropTest的get和set方法。get和set方法可以使用任何的变量名字,只需他们的地址能被传递到property类中,如下面的PropTest构造函数里面的代码般,代码行" property Count; "让我们在PropTest中得到可读写的int型的Count属性。现在你可以使用如一般的成员变量般使用使用Count属性了,但实际上你是间接地调用它set和get方法。
要使Count属性能成功工作,必须先在PropTest的构造函数里面对其进行初始化。
class PropTest
{
public:
PropTest()
{
Count.setContainer(this);
Count.setter(&PropTest::setCount);
Count.getter(&PropTest::getCount);
}
int getCount()
{
return m_nCount;
}
void setCount(int nCount)
{
m_nCount = nCount;
}
property Count;
private:
int m_nCount;
};
如下
本文译自http://www.codeguru.com/cpp_mfc/Property.html的Implementing a Property in C++
以下是译文
本文由Emad Barsoum投稿。
开发测试环境: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 *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 = NULL;
}
在如下的代码中,第一部分是 = 操作符的重载,它调用包含属性的类中的set函数设定其属性的值。第二部分则为了使整个属性类象ValueType类型一样起作用,所以它返回包含属性的类中get函数的返回值。
//-- 重载 = 号操作符使其能用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)();
}
现在我们来看看怎样使用它:
如下所示,在PropTest类中定义了一个叫做Count的简单属性。Count的实际值将保存到或检索之在PropTest的私有成员变量"m_nCount"中,通过PropTest的get和set方法。get和set方法可以使用任何的变量名字,只需他们的地址能被传递到property类中,如下面的PropTest构造函数里面的代码般,代码行" property Count; "让我们在PropTest中得到可读写的int型的Count属性。现在你可以使用如一般的成员变量般使用使用Count属性了,但实际上你是间接地调用它set和get方法。
要使Count属性能成功工作,必须先在PropTest的构造函数里面对其进行初始化。
class PropTest
{
public:
PropTest()
{
Count.setContainer(this);
Count.setter(&PropTest::setCount);
Count.getter(&PropTest::getCount);
}
int getCount()
{
return m_nCount;
}
void setCount(int nCount)
{
m_nCount = nCount;
}
property Count;
private:
int m_nCount;
};
如下
与在c++中实现属性相关下载资源
资源评论>在c++中实现属性
{chstring}









