仿照C++11 中的shared_ptr 写的智能指针,不像源码那么好,自己还需要 努力
template<class T>
class RefCount
{
private:
long refcount;
T* Ptr;
public:
~RefCount()
{
cout<<"delete"<<endl;
}
virtual bool DeletePtr()
{
if(refcount==0)
{
delete Ptr;
return true;
}
else
{
refcount--;
return false;
}
}
virtual void DeleteThis()
{
if(DeletePtr())
{
delete this;
}
}
RefCount(T* _ptr):Ptr(_ptr),refcount(0){}
inline bool Empty()
{
return refcount ==0;
}
inline void AddRef(){
refcount++;
}
inline void DeRef()
{
refcount --;
}
};
template<class T>
class JShare_Ptr
{
public:
typedef JShare_Ptr<T > MyPtr;
JShare_Ptr()
{
refcount = 0;
}
JShare_Ptr& operator=(const JShare_Ptr<T>& _Ptr)
{
if(this->ptr == _Ptr.ptr)
{
return *this;
}else
{
delete refcount;
this->ptr = _Ptr.ptr;
this->refcount = _Ptr.refcount;
refcount->AddRef();
}
}
JShare_Ptr& operator=(JShare_Ptr<T>& _Ptr)
{
if(this->ptr == _Ptr.ptr)
{
return *this;
}else
{
delete refcount;
this->ptr = _Ptr.ptr;
this->refcount = _Ptr.refcount;
refcount->AddRef();
}
}
JShare_Ptr(T* _ptr)
{
refcount = new RefCount<T>(_ptr);
ptr = _ptr;
}
JShare_Ptr(const JShare_Ptr<T >& _Ptr)
{
Assign(_Ptr);
}
~JShare_Ptr()
{
(refcount)->DeleteThis();
}
T* operator ->(){return ptr;}
T* operator*(){return ptr;}
private:
void Assign(const MyPtr& _Ptr)
{
ptr = _Ptr.ptr;
refcount = _Ptr.refcount;
(refcount) ->AddRef();
}
private:
T* ptr;
RefCount<T>* refcount;
};
}