句柄类是管理基类指针的类,“智能指针”的类其实就是句柄类。智能指针都有一个对应的计数器,这个计数器可以在智能指针指向的对象中,在“C++中的智能指针”中就是这样的;也可以在句柄类中。这两种有一些区别。
当计数器在智能指针对象的内部时,我们需要在类的外层加一层包装,之前用Ptr类,但是为了用计数器,在类Ptr外层包装了U_Ptr类。如下图:
其实还可以计数器和指针对象的分离,把计数器放到句柄类中,在“C++中的智能指针”以看到,不用在每一个句柄类中放一个计数器,句柄类要共有一个计数器;可以在句柄类使用一个计数器指针,这个指针对象公共的对象。这样做是模块化程序更高了,但是模块并没有更复杂。另外还可以把计数器写成类,计数器也“智能”。
- class HasPtr{
- public:
- HasPtr(int *p, int i):ptr(new U_Ptr(p)),val(i){}
- //重新实现复制否造函数
- HasPtr(const HasPtr &orig):
- ptr(orig.ptr),val(orig.val){++ptr->use;}
- HasPtr&operator=(const HasPtr& rhs);
- //获取成员变量的接口
- int *get_ptr()const { return ptr->ip;}
- int get_int const {return val;}
- //设置成员变量的接口
- void set_per(int *p){ptr->ip=p;}
- void set_int(int i){val=i;}
- int get_ptr_val()const {return *ptr->ip;}
- int set_ptr_val(int val)const {*prt->ip=val;}//指针的值没变,所以可以为const
- private:
- Ptr *ptr;
- size_t *ust;
- }
计数器的分离,不用重写U_Prt类,而Ptr指针还可以指向其基类对象。
但是当把HasPtr作为类Ptr的友元时,还是要改类Ptr的代码的(添加友元);如果智能指针指向其基类,也要在基类中添加友元,因为友元不能继承。