Chinaunix首页 | 论坛 | 博客
  • 博客访问: 268492
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-03 10:05
文章分类

全部博文(138)

文章存档

2016年(1)

2015年(137)

我的朋友

分类: C/C++

2015-03-03 10:11:04

句柄类存储和管理基类指针。指针所指的对象的类型可以变化,即可以指向基类对戏那个又可以指向派生类类型对象。用户通过句柄类访问继承层次的操纵。因为句柄类使用指针执行操作,虚成员的行为将在运行时根据句柄实际绑定的对象的类型而变化。因此,句柄的用户可以获得动态行为但无需操心指针的管理。

包装了继承层次的句柄有两个重要的设计考虑因素

1,像对任何保存指针的类一样。必须确定对复制控制做些什么。包装了继承层次的句柄通常表现的像一个只能指针或像一个值。

2,句柄类决定句柄接口屏蔽还是不屏蔽继承层次,如果不屏蔽继承层次,用户必须了解和使用基本层次中的对象。

我们将定义名为Sale_item的指针型句柄类,表示Item_base层次,Sales_item的用户将像使用指针一样使用它:将用户Sals_item绑定到Item_base类型的对象并使用*和—>操作符执行Item_base的操作。

例如:Sale_item item(Bulk_item("0-102-34529",35,4,43));

            item->net_price();//item像是指针一样。

用户可以不必管理句柄指向的对象,Sales_item类将完成这部分工作。当用户通过Sales_item类对像那个调用函数式,将获得多态行为。

Sales_item类将有两个数据成员,都是指针,一个指针将指向Item_base对戏那个,而另一个将指向使用计数,Item_base指针可以指向Item_base 也可以指向Item_base 派生类类型的对象,通过指向使用计数,多个Sale_item对象可以共享同一个计数器。


  1. class Sales_item  
  2. {  
  3. public:  
  4.     Sales_item():p(0),use(new size_t(1)){}  
  5.     Sales_item(const Item_base&);  
  6.     Sales_item(const Sales_item &i):p(i.p),use(i.use)  
  7.     {  
  8.     ++*use;   
  9.     }  
  10.     ~Sales_item(){dec_use();};  
  11.     Sales_item& operator=(const Sales_item&);  
  12.     const Item_base *operator->()const{if(p) return p;}  
  13.     const Item_base&  operator*()const{if(p) return *p;}  
  14. private:  
  15.     Item_base *p;  
  16.     size_t *use;  
  17.     void dec_use()  
  18.     {if(--*use==0){delete p;delete use;}}  
  19.   
  20. };  

  1. Sales_item& Sales_item::operator=(const Sales_item& i)  
  2. {  
  3.     ++*i.use;  
  4.     dec_use();  
  5.     p=i.p;  
  6.     use=i.use;  
  7.     return *this;  
  8.   
  9.   
  10. }  

要实现Item_base对象的构造函数,必须首先解决一个问题:我们不知道给予构造函数的对象的实际类型,我们知道他是一个Item_base对象或者是它的派生类的对象,句柄类经常需要在不知道对象的确切类型是分配一直对象的新副本。解决这个问题的通用方法是定义虚操作进行赋值,我们称将该操作clone



  1. class Item_base  
  2. {  
  3. public:  
  4.     virtual Item_base* clone()const  
  5.     {  
  6.     return new Item_base(*this);  
  7.     }  
  8. };  

  1. class Bulk_item:public Item_base  
  2. {  
  3.   
  4. public:  
  5.     Bulk_item* clont()const  
  6.     {  
  7.     return new Bulk_item(*this);  
  8.     }  
  9.   
  10. };  

  1. Sales_item::Sales_item(const Item_base &item):p(item.clone()),use(new size_t(1)){}  
像默认构造函数一样,这个构造函数分配并初始化使用计数,它调用形参的clone产生那个对象的虚副本,如果实参是Item_base对象,则运行Item_base的clone函数。如果是Bulk_item对象则执行它的clone函数。
阅读(812) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~