模擬 C++11 的shared_ptr

仿照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;
	};
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章