#include <iostream>
class Point{
public:
Point():xv(0),yv(0){}
Point(int a, int b):xv(a), yv(b){}
Point(const Point &p):xv(p.xv), yv(p.yv){}
int x() const {return xv;}
int y() const {return yv;}
Point & x(int x){xv = x; return *this;}
Point & y(int y){yv = y; return *this;}
private:
int xv;
int yv;
};
class Point3D:public Point{
public:
Point3D():zv(0){}
private:
int zv;
};
class Handler{
public:
Handler():p(0), use(new int(1)){}
Handler(const Point &p0):p(new Point(p0)), use(new int(1)){};//必须new
Handler(const Handler &i):p(i.p), use(i.use){++*use;}
~Handler(){decr_use();}
Handler & operator=(const Handler &);
Point * operator->()const{if(p)return p;}//这里可以是const的,那样的话就不能改变point内的值了
Point & operator*()const{if(p)return *p;}
private:
Point *p;
int *use;
void decr_use()
{if(--*use == 0){delete p; delete use;}}
};
/*
Handler::Handler(const Point &point)
{
p = point;
use = 1;
}
*/
Handler &
Handler::operator=(const Handler &h)
{
++*h.use;
decr_use();
p = h.p;
use = h.use;
return *this;
}
main()
{
Point p(1,2);
Handler h(p);
Point3D p3d;
h = p3d;
h->x(6);
h->y(6);
cout<<"point x = "<<h->x()<<" point y = "<<h->y()<<endl;
}
一个简单的句柄例子,注意注释里的几点。
C++语言的一个问题就是不支持使用对象进行面向对象编程,而是必须使用指针和引用。常用的解决方案是句柄和包装。句柄类存储和管理基类的指针,指针指向锁只对象的类型是可以变化的,既可以指向基类也可以指向派生类,用户通过句柄来访问继承层次的操作。句柄带来的好处就是可以获得动态行为,但无需操心指针的管理。