一 概述:
句柄类:存储和管理基类指针。指针所指对象可以变化,它即可以指向基类类型对象也可以指向派生类对象。用户可以通过句柄类访问继承层次的操作,句柄的用户可以获得动态行为但无需操心指针的管理。(搞清楚用处)
程序如下:
//句柄类的使用,仔细揣摩。
#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();
}
|
句柄(handle)类
最新推荐文章于 2015-08-06 16:14:00 发布