介绍在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/