模拟 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;
	};
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值