首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

强大的C++——模拟property(最后一部分)解决办法

2012-03-11 
强大的C++——模拟property(最后一部分)下面剩余部分的代码是针对不同访问控制的特化,这和以前没有什么两样。

强大的C++——模拟property(最后一部分)
下面剩余部分的代码是针对不同访问控制的特化,这和以前没有什么两样。
template <typename   T,   class   Host>
class   prop_e <T,   Host,   read>
:   private   data_holder <T,   Host>
{
friend   Host;
public:
prop(T&   val)
:   data_holder <T,   Host> (val)   {}
prop(Host&   h,   T   (Host::*g)())
:   data_holder <T,   Host> (h,   g,   0)   {}

public:
operator   T()   {
returnget();
}
};

template <typename   T,   class   Host>
class   prop   <T,   Host,   write>
:   private   data_holder <T,   Host>
{
friend   Host;
public:
prop(T&   val)
:   data_holder <T,   Host> (val)   {}
prop(Host&   h,   T   (Host::*s)(const   T&   arg))
:   data_holder <T,   Host> (h,   0,   s)   {}

public:
T   operator=(const   T&   val)   {
returnset(val);
}
};
prop <> 的使用也没有什么变化,和OOP版的是差不多的:
class   TestE
{
public:
TestE()
:   a(*this,   &TestE::get_a)
,   b(*this,   &TestE::set_b)
,   c(*this,   &TestE::get_c,   &TestE::set_c)
,   e(_e),   f(_f),   g(_g)
,   _a(123),   _b(0),   _e(443),   _f(0)   {}

public:
prop_e <int,   TestE,   read> a;//复杂属性
prop_e <float,   TestE,   write> b;   //复杂属性
prop_e <string,   TestE> c;   //复杂属性

prop_e <int,   PropImpl,   read> e;//简单属性
prop_e <float,   PropImpl,   write> f;   //简单属性
prop_e <string,   PropImpl> g;//简单属性

private:
int_a;
float_b;
string_c;

int_e;
float_f;
string_g;

intget_a()   {
return_a;
}

float   set_b(const   float&   b)   {
_b=b;
return_b;
}

string   get_c()   {
return_c;
}
string   set_c(const   string&   c)   {
_c=c;
return_c;
}
};

TestEt;
//t.a=100;
int   x=t.a;

t.b=200.0;
//float   y=t.b;

t.c= "ok ";
string   z=t.c;

//t.e=100;
x=t.e;

t.f=200.0;
//y=t.b;

t.g= "addsf ";
z=t.g;
OOP的实现和GP的实现各有特点:两者的使用基本一样,没有较大的差别;OOP的容错性强些,而GP的性能更好。
至此,我们已经使用了两种方法构造了完整的模拟属性。尽管在使用上无法和内置属性相比,但也显出了其灵活之处。但是从根本上讲,模拟属性仅仅是近似地模拟了属性的行为,在某些特定的场合下,模拟属性无法实现内置属性的功能。以下便是一种典型的情况:
class   V
{
public:
V(int   v)
:   _v(v)   {}

public:
int   _v;
};

double   fun1(const   V&   v)   {
returnv._v;
}

int   main()   {
Testt;//假设t有一个prop <int,…> 类型的模拟属性p1,
//   以及一个int类型的内置属性p2(假设C++有内置属性)
fun1(t.p2);//OK,只有一次类型转换int=> V
fun1(t._p1);   //编译错误,无法实施隐式的二次转换   prop <…> => int=> V
fun1(static_cast <int> (t._p1));//必须使用显式的转换

return0;
}
这里我们可以看到当我们使用t._p1调用fun1时,需要隐式地进行两次转换:第一次从prop <int,   …> 通过定制的转型操作符转换到int,第二次通过V的单参数构造函数V(int)从int转换到V。但是C++不允许两次隐式的类型转换,所以会引发一个编译错误。这种情况下,必须使用显式的类型转换。而内置属性的类型是int,只需一次转换即可实现从int=> V。这就是内置属性和模拟属性之间的差别。要解决这个问题,必须要求C++放松隐式转换的次数限制。但过于宽松的类型转换机制会引发诸多软件开发上的问题,仅仅为了一个模拟属性,不值得这么做。如果真要属性,C++加上便是了,就像C++/CLI那样。但对于C++而言,还有远比属性更重要的功能。




[解决办法]
先顶
看了再说


[解决办法]
收藏,晚上看
[解决办法]
学习
[解决办法]
Mark~

热点排行