a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 63|回复: 0

[考试试题] C++类成员属性的一种简洁实现(1)

[复制链接]
发表于 2012-7-31 21:53:42 | 显示全部楼层 |阅读模式
  一般来说对于标准C++而言是不存在成员属性这个概念的,以前大家都是用GetXXX/SetXXX来访问或取得数据,好象也没有感觉到任何不便。但是当我们用过C#之类的语言之后,我们总觉得C++这个方式太老土了。于是我们想 ...
8 w; N3 u& D3 Y, ?4 A& c5 W  一般来说对于标准C++而言是不存在成员属性这个概念的,以前大家都是用GetXXX/SetXXX来访问或取得数据,好象也没有感觉到任何不便。但是当我们用过C#之类的语言之后,我们总觉得C++这个方式太老土了。于是我们想去实现“属性”这个C++语言缺乏的要素。事实上网络上有很多人已经做了这部分工作,实现的方法有很多种,一种是用模板,一种是根据特定语言来写的,如VC(指的是Microsoft实现的C++)。但是它们要么很复杂,要么很难记住它的准确用法,嗯我总是喜欢简单的东西,因为太复杂的东东会让我的头脑当机。废话少说,来看看如何实现。3 p8 B; y' y% v( h
  在实现之前,我必需先探讨一下为什么需要“属性”这个东东。比如说下面雇员这个类:
' H  o' i. C$ O# n/ ~7 ]4 p  Y  class CEmployee9 n& l( w. J$ W4 {2 ~
  {
# r! _, E; a1 @6 n  public:
" L+ r) V" D/ f/ e5 r' K' I  int Old; //年龄
1 Y, W" h/ f! I, l  };
7 j. {$ a5 F+ \9 |' S  CEmployee employee;1 ?" p! k5 n3 K& s3 h
  employee.Old=22;( K# k7 J) B0 K! ~. j
  int old =employee.Old;6 ^5 r$ V4 E/ t9 [; S- X
  它有一个成员变量,我们可以直接对它们进行赋值或者读取,但是往往会缺少一个很重要的东东,就是不能对所赋值进行校验,这可是个大问题,比如我们给 Old一个负值,比如-50,提示程序运行时不会有任何错误,但是的确这个成员变量的值在逻辑上是不正确的。于是我们会写上GetOld、SetOld。现在OK了,这个小问题解决了,但新问题来了。我们的类使用者,他们需要重新把他们的代码成写如下的样子,而不是上面的那样。  }4 l' Q0 z! s- n$ @+ c8 J
  CEmployee employee;
- z2 M4 D, Z# h. ]  employee.SetOld(22);4 w7 }: z  z! a# G9 w" n
  int old =employee.GetOld();
9 b- b+ s: n  @# h  你的伙伴一定会在写代码时诅咒你写了一个垃圾的类。所以你决定要改变这个现状。很幸运,你是MS的忠实用户,而且你对于MSDN看很仔细,所以你知道可以这样来写; H: x+ Y2 M: u* _) z0 B
  class CEmployee# b9 m& z. g# a$ b$ M+ b% ?2 P
  {* C" g5 [: p1 F  M
  private:* x* E! z" @4 s) R! |$ H; g
  int m_old;+ _& f& Q7 {+ g8 H. r1 S
  public:! R4 N2 o2 O/ W( a8 ?6 v
  _declspec(property(get= GetOld,put=SetOld))int Old;( u2 E% L* P  E
  int GetOld(void)
+ s+ b5 L* u: G& M" U  {
) Y% N3 [4 x+ m. U  return m_old;
6 d. \8 o  C( I" L3 F" D  }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-19 22:51 , Processed in 0.312378 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表