// Fill out your copyright notice in the Description page of Project Settings.
#include "MyActor.h"
// Sets default values
AMyActor::AMyActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
Super::BeginPlay();
MySharePtrTest();
MySharePtrTestCastToAnotherSharePtr();
MyConstSharePtrTestCastToAnotherSharePtr();
MySharePtrToShareRef();
MyShareRefTest();
MyShareRefTestCastToAnotherShareRef();
MyConstShareRefTestCastToAnotherShareRef();
MyShareRefToSharePtr();
MyWeakPtrTest();
MyWeakPtrToSharePtr();
MyWeakPtrToShareRef();
MySharedFromThisTest();
TestCrash();
}
//////////////////////////////////////////////////////////////////////////SharePtr
//智能指针如何使用
void AMyActor::MySharePtrTest()
{
m_pSharePtrBase = MakeShareable(new ClassBase());
if (m_pSharePtrBase.IsValid() || m_pSharePtrBase.Get())
{
//使用nBase
m_pSharePtrBase->nBase;
}
}
//SharePtr类型转换成其他的SharePtr
void AMyActor::MySharePtrTestCastToAnotherSharePtr()
{
//基类对象指向了派生类的成员.多态案例在这也是一样的
TSharedPtr<ClassBase> ptrbase = MakeShareable(new ClassTop());
TSharedPtr<ClassTop> ptrcast = StaticCastSharedPtr<ClassTop>(ptrbase);
if (ptrcast.IsValid())
{
ptrcast->MyFunc();
}
}
//Const SharePtr转换成其他的SharePtr
void AMyActor::MyConstSharePtrTestCastToAnotherSharePtr()
{
//基类对象指向了派生类的成员.多态案例在这也是一样的
const TSharedPtr<ClassBase> ptrbase = MakeShareable(new ClassTop());
{
//错误写法, 不能通过ConstCastSharedPtr直接转成派生类.
//TSharedPtr<ClassTop> ptrcast = ConstCastSharedPtr<ClassTop>(ptrbase);
}
{
//正确写法1
//先通过ConstCastSharedPtr转成非const的基类
TSharedPtr<ClassBase> ptrcast = ConstCastSharedPtr<ClassBase>(ptrbase);
//再通过StaticCastSharedPtr转换
TSharedPtr<ClassTop> ptrcast2 = StaticCastSharedPtr<ClassTop>(ptrcast);
if (ptrcast2.IsValid())
{
ptrcast2->MyFunc();
}
}
{
//正确写法2
//直接通过StaticCastSharedPtr转换
TSharedPtr<ClassTop> ptrcast = StaticCastSharedPtr<ClassTop>(ptrbase);
if (ptrcast.IsValid())
{
ptrcast->MyFunc();
}
}
}
//SharePtr类型转换成ShareRef类型
void AMyActor::MySharePtrToShareRef()
{
TSharedPtr<ClassBase> ptr = MakeShareable<ClassBase>(new ClassTop());
if (ptr.IsValid())
{
TSharedRef<ClassBase> ref = ptr.ToSharedRef();
}
}
//////////////////////////////////////////////////////////////////////////ShareRef
//SharePtr如何使用
void AMyActor::MyShareRefTest()
{
//TSharedRef没有IsValid方法, 因为它一直是有效的
TSharedRef<ClassBase> ref = MakeShareable(new ClassTop());
ref->nBase;
}
//ShareRef类型转换成其他的ShareRef
void AMyActor::MyShareRefTestCastToAnotherShareRef()
{
//TSharedRef没有IsValid方法, 因为它一直是有效的
TSharedRef<ClassBase> ref = MakeShareable(new ClassTop());
TSharedRef<ClassTop> refCast = StaticCastSharedRef<ClassTop>(ref);
refCast->MyFunc();
}
//Const ShareRef转换成其他的ShareRef
void AMyActor::MyConstShareRefTestCastToAnotherShareRef()
{
//TSharedRef没有IsValid方法, 因为它一直是有效的
const TSharedRef<ClassBase> ref = MakeShareable(new ClassTop());
{
//错误写法, 不能通过ConstCastSharedRef直接转成派生类.
//TSharedRef<ClassTop> refcast1 = ConstCastSharedRef<ClassTop>(ref);
}
{
//正确写法1, 先通过ConstCastSharedRef转换城非Const的基类
TSharedRef<ClassBase> refcast1 = ConstCastSharedRef<ClassBase>(ref);
//再通过StaticCastSharedRef转换
TSharedRef<ClassTop> refcast2 = StaticCastSharedRef<ClassTop>(refcast1);
refcast2->MyFunc();
}
{
//正确写法2
//直接通过StaticCastSharedRef转换
TSharedPtr<ClassTop> refcast = StaticCastSharedRef<ClassTop>(ref);
if (refcast.IsValid())
{
refcast->MyFunc();
}
}
}
//ShareRef类型转换成SharePtr类型
void AMyActor::MyShareRefToSharePtr()
{
TSharedRef<ClassBase> ref = MakeShareable(new ClassTop());
TSharedPtr<ClassBase> ptr = ref;
}
//////////////////////////////////////////////////////////////////////////TWeakPtr
//TWeakPtr如何使用
void AMyActor::MyWeakPtrTest()
{
TSharedPtr<ClassBase> ptr = MakeShareable(new ClassTop());
//通过SharePtr初始化TWeakPtr
TWeakPtr<ClassBase> WeakPtr = ptr;
TWeakPtr<ClassBase> WeakPtr2(ptr);
//通过ShareRef初始化TWeakPtr
TSharedRef<ClassBase> ref = ptr.ToSharedRef();
TWeakPtr<ClassBase> WeakPtr3 = ref;
TWeakPtr<ClassBase> WeakPtr4(ref);
}
//TWeakPtr如何转换成SharePtr
void AMyActor::MyWeakPtrToSharePtr()
{
TSharedPtr<ClassBase> ptr = MakeShareable(new ClassTop());
//通过SharePtr初始化TWeakPtr
TWeakPtr<ClassBase> WeakPtr = ptr;
//利用WeakPtr的.Pin()函数将WeakPtr转成SharedPtr
TSharedPtr<ClassBase> WeakPtrToSharePtrObj = WeakPtr.Pin();
if (WeakPtrToSharePtrObj.IsValid())
{
//tdo smth...
}
}
//TWeakPtr如何转换成ShareRef
void AMyActor::MyWeakPtrToShareRef()
{
TSharedPtr<ClassBase> ptr = MakeShareable(new ClassTop());
//通过SharePtr初始化TWeakPtr
TWeakPtr<ClassBase> WeakPtr = ptr;
//利用WeakPtr的.Pin()函数将WeakPtr转成SharedPtr
TSharedPtr<ClassBase> WeakPtrToSharePtrObj = WeakPtr.Pin();
if (WeakPtrToSharePtrObj.IsValid())
{
//利用TSharedPtr的ToSharedRef()函数将TSharedPtr转换成TSharedRef
TSharedRef<ClassBase> ref = WeakPtrToSharePtrObj.ToSharedRef();
}
}
//////////////////////////////////////////////////////////////////////////TSharedFromThis
//如何使用继承自TSharedFromThis的类
void AMyActor::MySharedFromThisTest()
{
TSharedPtr<ClassTop> ptr = MakeShareable(new ClassTop());
if (ptr.IsValid())
{
//我们通过.Get()将TSharedPtr转换成C++ 原生指针
ClassTop* pOriginPtr = ptr.Get();
//现在我们想将pOriginPtr这个原生C++指针怎么转回智能指针呢?
{
//错误的用法, 也能这么用, 但是不建议
//TSharedPtr<ClassTop> ptr = MakeShareable(pOriginPtr);
//错误的用法, AsShared()不能用派生类接
//TSharedPtr<ClassTop> ptr22 = pOriginPtr->AsShared();
}
{
//正确的用法, AsShared()不能用基类接(基类指的是你继承自TSharedFromThis的那个类)
TSharedPtr<ClassBase> ptr2 = pOriginPtr->AsShared();
TSharedPtr<ClassTop> ptr3 = StaticCastSharedPtr<ClassTop>(ptr2);
if (ptr3.IsValid())
{
ptr3->MyFunc();
}
}
}
}