理解句柄类.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
理解句柄类

理解句柄类(一) /u2/82750/showart_1331716.html查看原文在代理类的帮助下,我们已经可以实现在一个容器里存储一个类层次里所有类型的对象,但是代理有一个很明显的缺点,就是需要复制对象,当一个对象非常大或者是一种不能轻易复制的资源的时候,这个实现遇到了很大的困难,于是我们有了句柄(handle)类这个技术。?我们有这么一个类class point{public:?point():x_cdt(0),y_cdt(0){}?point(int x,int y):x_cdt(x),y_cdt(y){}?int get_x()?{ return x_cdt;}?int get_y()?{ return y_cdt;}?point set_x(int x)//返回值是point是为了实现这样的表达?{ //p.set_x(2).set_y(4);?x_cdt = x;?return *this;?}?point set_y(int y)?{?y_cdt = y;?return *this;?}private:?int x_cdt,y_cdt;};这个类有一切他应该有的成员函数,然后我们希望有这么一个handle能够替代实现他的所有功能,而又保证不需要复制这个对象,我们能想到的第一个方法当然是得到这个对象的指针但是这样我们就又把内存的分配暴露到了用户面前,可以随意的得到底层的指针。这个handle第一次是写成这样的:class handle{public:?handle();?handle(int x,int y);?handle(const point);?handle(const handle);?handle operator=(const handle);?~handle();private:?point* operator-();}我们暂时没有把set_x()这样的成员先假如到这里,为了简便。当我们写完之后,我们又遇到了时刻困扰我们的问题,就是对象的删除,既然我们允许把一个对象绑定到多个handle上,当其中的一个handle删除的时候,这个对象会怎么样呢?这个问题是要解决的。这里,我们呢引入了引用计数的概念,很显然,我们不能把这个引用计数放到我们的handle类中,因为一旦我们这么做了,当我们用一个handle绑定到一个对象的时候,他必须知道其他所有绑定到这个对象的handle的引用计数,然后更新这个计数,这非常困难。那么如果我们把这个引用计数放到对象本身呢?稍微思考一下就知道也是不合理的,这样做意味着我们每次都要改写对象。所以,综上考虑,我们决定写一个新的类来存放这个引用计数,这个类是完全为了技术的实现设计的,所以我们把他的所有成员设置成private,而让handle成为他的友元类,具体是这样的:class count_point{?friend class handle;?point p;?int count;?count_point();?count_point(int x,int y);?count_point(const count_point);?};有了这个引用计数,我们就可以让我们之前的一个小忧虑变得合理点,就是我们在handle中有一个?point* operator-();现在我们这样改写这个handle类:class handle{public:?handle();?handle(int x,int y);?handle(const point);?handle(const handle);?handle operator=(const handle);?~handle();private:?count_point* ptr;};好了,至此,框架已经行程,我们来实现句柄。class count_point{?friend class handle;?point p;?int count;?count_point():count(1){}?count_point(int x,int y):p(x,y),count(1){}?count_point(const pointh):p(h),count(1){}?};然后是handle类:class handle{public:?handle():ptr(new count_point){}?handle(int x,int y):ptr(new count_point(x,y)){}?handle(const pointh):ptr(new count_point(h)){}?handle(const handleh):ptr(h.ptr){++ptr-count;}?handle operator=(const handleh)?{?

文档评论(0)

dart001 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档