#include <map>
#include <string>
#include <iostream>
#include <memory>
using namespace std;
//模板类作为友元时要先有声明
template <typename T>
class SmartPtr;
template <typename T>
class U_Ptr //辅助类
{
private:
//该类成员访问权限全部为private,因为不想让用户直接使用该类
friend class SmartPtr<T>; //定义智能指针类为友元,因为智能指针类需要直接
//构造函数的参数为基础对象的指针
U_Ptr(T *ptr) :p(ptr), count(1) { }
//析构函数
~U_Ptr() { delete p; }
//引用计数
int count;
//基础对象指针
T *p;
};
template <typename T>
class SmartPtr //智能指针类
{
public:
SmartPtr(T *ptr) :rp(new U_Ptr<T>(ptr)) { } //构造函数
SmartPtr(const SmartPtr<T> &sp) :rp(sp.rp) { ++rp->count; } //复制构造函数
T & operator *() //重载*操作符
{
return *(rp->p);
}
T* operator ->() //重载->操作符
{
return rp->p;
}
~SmartPtr()
{
int size = rp->count;
cout << "准备析构,还有" << size << "个指针指向基础对象" << endl;
if (--rp->count == 0)
{
size = rp->count;
delete rp;
}
else
{
size = rp->count;
}
cout << "析构完成,还有" << size << "个指针指向基础对象" << endl;
}
private:
U_Ptr<T> *rp; //辅助类对象指针
};
C++引用计数实现
最新推荐文章于 2024-03-11 17:51:40 发布