天天看点

more effective c++——Item M29 引用计数(三)带引用计数的基类的实现

​​more effective c++——Item M29 引用计数(一)​​​和​​more effective c++——Item M29 引用计数(二)​​这两篇都是针对char *的实现,虽然能够正常工作,但是存在以下问题:

1.用户类仍然需要构造自己的数据结构,并对值、计数器进行操作

2.不便于移植,需要对原始的类做特定的修改,不同的数据类型需要重新设计

3.必须要有权限修改数据类的源代码,如果该类存在于lib中,则无法实现

是否可以设计一种新的类,达到引用计数的效果的同时避免上述问题,并且对用户屏蔽该类的实现?stanly lippman提供了带引用计数的基类的方法来解决这些问题——通过构建一个智能指针类来代理原始类,

带引用计数基类的String类

RCObject类实现如下:

有了引用计数的基类,可以开始着手实现持有rcobject对象的类了,该类负责引用计数的增减及对象的构造与释放,它相当于一个简易的智能指针,主要实现以下功能:

1.原始指针作为参数的构造函数

2.由于持有堆内存上的对象,因此需要实现拷贝构造函数与赋值操作符

3.析构函数,负责根据引用计数的值判断是否需要删除堆上的资源

4.提供operator->与operator*操作符,用于模拟指针操作

5.为了不限于为某一类型提供服务,实现为模板类,且其模板类型必须从rcobject继承

实现如下:

有了引用计数的基类及智能指针,以前实现的stringvalue则不再需要持有rfcount,只需要从它继承,然后持有必要的资源,让rcptr负责引用计数与构造析构相关的工作即可,以下为stringvalue及String类的实现:

通用引用计数的实现

RCIPtr的使用: