class FTestA {
public:
	FTestA() {
		UE_LOG(LogTemp, Warning, TEXT("FTestA 构造"));
	}
	void TestFun() {
		UE_LOG(LogTemp, Warning, TEXT("FTestA TestFun方法"));
	}
	~FTestA() {
		UE_LOG(LogTemp, Warning, TEXT("FTestA 析构"));
	}
};

class FTestAChild : public FTestA {
public:
	FTestAChild() {
		UE_LOG(LogTemp, Warning, TEXT("FTestAChild 构造"));
	}
	void TestFunChild() {
		UE_LOG(LogTemp, Warning, TEXT("FTestAChild TestFunChild方法"));
	}
	~FTestAChild() {
		UE_LOG(LogTemp, Warning, TEXT("FTestAChild 析构"));
	}
};

UFUNCTION(BlueprintCallable)
void MyTest();

void MyTest()
{
	//共享指针
	{
		TSharedPtr<FTestA, ESPMode::NotThreadSafe> SharedPtr = MakeShareable(new FTestA);	//创建时SharedReferenceCount=1
		if (SharedPtr.IsValid()) {
			SharedPtr->TestFun();

			int32 SharedReferenceCount = SharedPtr.GetSharedReferenceCount();
			UE_LOG(LogTemp, Warning, TEXT("SharedReferenceCount : %d"), SharedReferenceCount);

			//手动释放
			//SharedPtr = nullptr;
			UE_LOG(LogTemp, Warning, TEXT("SharedPtr.IsUnique : %d"), SharedPtr.IsUnique());
			SharedPtr.Reset();
		}
	}

	//共享引用
	{
		//TSharedRef<FTestA, ESPMode::NotThreadSafe> SharedRef = MakeShareable(new FTestA()); //将共享指针隐式转换成引用
		TSharedRef<FTestA, ESPMode::NotThreadSafe> SharedRef(new FTestA);
		SharedRef->TestFun();
		int32 SharedReferenceCount = SharedRef.GetSharedReferenceCount();
		UE_LOG(LogTemp, Warning, TEXT("SharedReferenceCount : %d"), SharedReferenceCount);
		UE_LOG(LogTemp, Warning, TEXT("SharedRef.IsUnique : %d"), SharedRef.IsUnique());
	}

	//相互转化
	{
		//共享引用转化成共享指针
		UE_LOG(LogTemp, Warning, TEXT("共享引用转化成共享指针"));
		TSharedRef<FTestA, ESPMode::NotThreadSafe> SharedRef(new FTestA);
		TSharedPtr<FTestA, ESPMode::NotThreadSafe> SharedPtr = SharedRef;
	}
	{
		//共享指针转化成共享引用
		UE_LOG(LogTemp, Warning, TEXT("共享指针转化成共享引用"));
		TSharedPtr<FTestA, ESPMode::NotThreadSafe> SharedPtr = MakeShareable(new FTestA);
		TSharedRef<FTestA, ESPMode::NotThreadSafe> SharedRef = SharedPtr.ToSharedRef();
	}

	//继承关系转化
	{
		TSharedPtr<FTestA, ESPMode::NotThreadSafe> SharedPtr = MakeShareable(new FTestAChild);
		if(SharedPtr.IsValid()) {
			SharedPtr->TestFun();
			TSharedPtr<FTestAChild, ESPMode::NotThreadSafe> SharedPtr2 = StaticCastSharedPtr<FTestAChild>(SharedPtr);	//ConstCastSharedPtr:常量共享指针转化
			if (SharedPtr2.IsValid()) {
				SharedPtr2->TestFunChild();
			}
		}
	}
}
//弱指针的用法:
//1、弱指针不能影响强指针的引用计数
//2、在使用弱指针时,需要对其进行检测,判断其是否有效
//3、弱指针最大的用途就是解决环形引用的问题
//4、弱指针另一个作用是不对资源进行竞争,只能使用资源,却没有权限控制资源的生命周期
class IAnimal {
public:
	virtual void SetRestraint(const TSharedPtr<IAnimal>& InWhatAnimal) = 0;
	virtual ~IAnimal() {};
};

class FMouse;
class FElephant;

class FLion : public IAnimal {
public:
	FLion() {
		UE_LOG(LogTemp, Warning, TEXT("我是狮子,我克制老鼠"));
	}
	virtual void SetRestraint(const TSharedPtr<IAnimal>& InWhatAnimal) {
		Mouse = StaticCastSharedPtr<FMouse>(InWhatAnimal);
	}
	virtual ~FLion() {
		UE_LOG(LogTemp, Warning, TEXT("我是狮子,我没了"));
	}

	//TSharedPtr<FMouse> Mouse;
	TWeakPtr<FMouse> Mouse;
};

class FMouse : public IAnimal {
public:
	FMouse() {
		UE_LOG(LogTemp, Warning, TEXT("我是老鼠,我克制大象"));
	}
	virtual void SetRestraint(const TSharedPtr<IAnimal>& InWhatAnimal) {
		Elephant = StaticCastSharedPtr<FElephant>(InWhatAnimal);
	}
	virtual ~FMouse() {
		UE_LOG(LogTemp, Warning, TEXT("我是老鼠,我没了"));
	}

	//TSharedPtr<FElephant> Elephant;
	TWeakPtr<FElephant> Elephant;
};

class FElephant : public IAnimal {
public:
	FElephant() {
		UE_LOG(LogTemp, Warning, TEXT("我是大象,我克制狮子"));
	}
	virtual void SetRestraint(const TSharedPtr<IAnimal>& InWhatAnimal) {
		Lion = StaticCastSharedPtr<FLion>(InWhatAnimal);
	}
	virtual ~FElephant() {
		UE_LOG(LogTemp, Warning, TEXT("我是大象,我没了"));
	}

	//TSharedPtr<FLion> Lion;
	TWeakPtr<FLion> Lion;
};

UFUNCTION(BlueprintCallable)
void MyTest2();

void MyTest2()
{
	TSharedPtr<FElephant> Elephant = MakeShareable(new FElephant);
	TSharedPtr<FLion> Lion = MakeShareable(new FLion);
	TSharedPtr<FMouse> Mouse = MakeShareable(new FMouse);

	Elephant->SetRestraint(Lion);
	Lion->SetRestraint(Mouse);
	Mouse->SetRestraint(Elephant);
	UE_LOG(LogTemp, Warning, TEXT("SharedReferenceCount : %d"), Elephant.GetSharedReferenceCount());
	UE_LOG(LogTemp, Warning, TEXT("SharedReferenceCount : %d"), Lion.GetSharedReferenceCount());
	UE_LOG(LogTemp, Warning, TEXT("SharedReferenceCount : %d"), Mouse.GetSharedReferenceCount());
}

  

posted on 2024-03-09 18:08  baihuntun  阅读(8)  评论(0编辑  收藏  举报