架构共享指针和弱指针

SharedPtr.h

template<class T>
class FWeakPtr;

class FTestPtr
{
public:

	FTestPtr()
	{
		a = 1000;
	}
	~FTestPtr()
	{

	}

	void Init()
	{
		cout << "Init" << endl;
	}

private:
	int a;

};

template<class T>
class FSharedPtr
{
	friend class FWeakPtr<T>;
public:

	//FSharedPtr<FTest> Instance(new FTest);
	FSharedPtr(T* InInstance = NULL)
		:Ptr(InInstance)
	{
		Count = new FRefCounter();
		if (InInstance)
		{
			Count->SharedCount = 1;
		}
	}

	//FSharedPtr<FTest> Instance1(new FTest);
	//FSharedPtr<FTest> Instance(Instance1);
	FSharedPtr(FSharedPtr<T> &InInstance)
	{
		this->Ptr = InInstance.Ptr;
		InInstance.Count->SharedCount++;
		this->Count = InInstance.Count.;
	}

	FSharedPtr(FWeakPtr<T>& InInstance)
	{
		this->Count = InInstance.Count;
		this->Count->SharedCount++;
		this->Ptr = InInstance.Ptr;
	}

	//FSharedPtr<FTest> Instance1(new FTest);
	//FSharedPtr<FTest> Instance = Instance1;
	FSharedPtr<T>& operator=(FSharedPtr<T>& InInstance)
	{
		if (this != &InInstance)
		{
			Release();
			InInstance.Count->SharedCount++;
			this->Count = InInstance.Count;
			this->Ptr = InInstance.Ptr;
		}
		return *this;
	}

	FSharedPtr<T>& operator=(FWeakPtr<T>& InInstance)
	{
		if (this->Ptr == InInstance.Ptr)
		{
			Release();
			this->Count = InInstance.Count;
			this->Count->SharedCount++;
			this->Ptr = InInstance.Ptr;
		}
	}

	T *operator*()
	{
		return *Ptr;
	}

	T *operator->()
	{
		return Ptr;
	}

	void Release()
	{
		Count->SharedCount--;

		if (Count->SharedCount >= 0)
		{
			if (Count->SharedCount < 1)
			{
				if (Count->WeakCount < 1)
				{
					delete Count; //弱指针也要判断 告诉弱指针,智能指针的情况
					Count = nullptr;
				}

				delete Ptr;
				Ptr = nullptr;
			}
		}

	}

	~FSharedPtr()
	{
		Release();
	}

private:
	T* Ptr;
	FRefCounter* Count;

};

template<class T>
class FWeakPtr
{
	friend class FSharedPtr<T>;

public:
	FWeakPtr()
		:Ptr(nullptr)
		, Count(nullptr)
	{

	}

	FWeakPtr(FSharedPtr<T>& InInstance)
		:Ptr(InInstance.Ptr)
		, Count(InInstance.Count)
	{
		Count->WeakCount++;
	}

	FWeakPtr<T>& operator=(FWeakPtr<T>& Wt)
	{
		if (Wt != this)
		{
			Release();
			Count = Wt.Count;
			Ptr = Wt.Ptr;

			Count->WeakCount++;
		}

		return *this;
	}

	FWeakPtr<T>& operator=(FSharedPtr<T>& St)
	{
		Release();
		Count = St.Count;
		Ptr = St.Ptr;

		Count->WeakCount++;

		return *this;
	}

	FSharedPtr<T> Pin()
	{
		FSharedPtr<T> SP(*this);
		return SP; //弱指针
	}

	bool IsVaild()
	{
		if (Count)
		{
			if (Count > 0)
			{
				return true;
			}
		}

		return false;
	}

	~FWeakPtr()
	{
		Release();
	}

	void Release()
	{
		if (Count)
		{
			Count->WeakCount--;
			if (Count->WeakCount < 1 && Count->SharedCount < 1)
			{
				delete Count;
				Count = nullptr;
			}
		}
	}

private:
	T* Ptr;
	FRefCounter* Count;
};

int main()
{
	FSharedPtr<FTestPtr> TestPtr(new FTestPtr());
	FSharedPtr<FTestPtr> TestPtr2(TestPtr);
	FSharedPtr<FTestPtr> TestPtr3(TestPtr2);

	TestPtr3.Release();
	TestPtr2->Init();
	TestPtr2.Release();

	FWeakPtr<FTestPtr> HelloPtr = TestPtr;
	FWeakPtr<FTestPtr> HelloPtr2(TestPtr);
	HelloPtr2.Pin()->Init();
	HelloPtr2.Release();

	return 0;
}

PtrType.h

//引用计数
class FRefCounter
{
public:
	FRefCounter()
		:SharedCount(0)
		, WeakCount(0)
	{

	}

	int SharedCount;
	int WeakCount;

};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值