句柄(handle)类

一 概述:
     句柄类:存储和管理基类指针。指针所指对象可以变化,它即可以指向基类类型对象也可以指向派生类对象。用户可以通过句柄类访问继承层次的操作,句柄的用户可以获得动态行为但无需操心指针的管理。(搞清楚用处

程序如下:
//句柄类的使用,仔细揣摩。
#include<iostream>
using namespace std;

class Base
{
public:
virtual void test()
{
cout<<"Base test"<<endl;
    }
virtual Base *clone()const
{
cout<<"Base"<<endl;
return new Base(*this);
}
private:
};

class Driver:public Base
{
public:
void test()
{
cout<<"Driver test"<<endl;
    }
virtual Driver *clone() const
{
   cout<<"Driver"<<endl;
   return new Driver(*this);
}
};
class Handle//句柄类
{
public:
Handle():p(0),use(new size_t(1)){}//默认构造函数创建未绑定的handle类对象

    Handle(const Base &b):p(b.clone()),use(new size_t (1)){}//接受一个对象,将句柄类与其关联

Handle(const Handle &h):p(h.p),use(h.use)
{
++(*use);
}
Handle &operator=(const Handle &h)
{
++*h.use;//防止自我赋值
decr_use();
p=h.p;
use=h.use;
return *this;
}
//用户通过——>和*访问Base的成员。因为这两个操作符分别返回指针和引用,所以通过这些操作符调用的函数将进行动态绑定。
Base *operator->() const
{
if(p)
  return p;
else
;//error
}
Base &operator*()const
{
if(p)
return *p;
else
;//error
}
~Handle(){decr_use();}
private:
Base *p;
    size_t *use;
void decr_use()
{
if(--(*use)==0)
{
delete p;
delete use;
}
}
};
int main()
{
Base b;
Driver d;
Handle h1(b);//基类的clone,产生基类对象
Handle h2(d);//派生类的clone,产生派生类对象
//访问继承层次中类的成员
h1->test();
(*h1).test();
h2->test();
(*h2).test();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值