//
// Created by 肖乃全 on 2019-01-25.
//
#ifndef EXERCISE_SMARTPOINT_H
#define EXERCISE_SMARTPOINT_H
#include <iostream>
template <class T>
class SmartPtr;
/*
* 引用计数器 :_count
* 指向实际空间的指针 : _ptr
*/
template<class T>
class Asistant
{
friend class SmartPtr<T>;
private:
Asistant(T *ptr),_count(1),_ptr(ptr)
{
}
~Asistant()
{
delete _ptr;
_ptr = nullptr;
}
int _count; // 计数
T *_ptr;//
};
//指向辅助类的指针
class SmartPtr
{
public:
SmartPtr(T *ptr):_p(new Asistant<T>(ptr))
{
}
SmartPtr(const SmartPtr<T> &sp)
{
_p = sp._p;
_p->_count++;
}
SmartPtr& operator=(const SmartPtr<T> &sp)
{
if(this != sp)
{
if(--(_p->_count) == 0)
{
delete _p; //会先调用辅助类的析构函数(释放实际空间),再释放辅助类对象空间
}
//指向新的辅助空间
_p = sp._p;
(_p->_count)++;
}
return *this;
}
~SmartPtr()
{
if(--(_p->_count) == 0)
{
delete _p;
_p = nullptr;
}
}
T *operator->()
{
return _p->_ptr;
}
T &operator*()
{
return *(_p->_ptr);
}
private:
Asistant<T> *_p;
};
#endif //EXERCISE_SMARTPOINT_H
本文由 Ryan 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2019/01/25 11:34