1. 侵入性访问器
共享指针是非侵入性的,意味对象不知道其是否为智能指针拥有。此通常是可以接受的,但在某些情况下,可能要将对象作为共享引用或共享指针进行访问。
class FRegistryObject;
class FMyBaseClass: public TSharedFromThis<FMyBaseClass>
{
virtual void RegisterAsBaseClass(FRegistryObject* RegistryObject)
{
// 访问对"this"的共享引用。
// 直接继承自< TSharedFromThis >,因此AsShared()和SharedThis(this)会返回相同的类型。
TSharedRef<FMyBaseClass> ThisAsSharedRef = AsShared();
// RegistryObject需要 TSharedRef<FMyBaseClass>,或TSharedPtr<FMyBaseClass>。TSharedRef可被隐式转换为TSharedPtr.
RegistryObject->Register(ThisAsSharedRef);
}
};
class FMyDerivedClass : public FMyBaseClass
{
virtual void Register(FRegistryObject* RegistryObject) override
{
// 并非直接继承自TSharedFromThis<>,因此AsShared()和SharedThis(this)不会返回相同类型。
// 在本例中,AsShared()会返回在TSharedFromThis<> - TSharedRef<FMyBaseClass>中初始指定的类型。
// 在本例中,SharedThis(this)会返回具备"this"类型的TSharedRef - TSharedRef<FMyDerivedClass>。
// SharedThis()函数仅在与 'this'指针相同的范围内可用。
TSharedRef<FMyDerivedClass> AsSharedRef = SharedThis(this);
// FMyDerivedClass是FMyBaseClass的一种类型,因此RegistryObject将接受TSharedRef<FMyDerivedClass>。
RegistryObject->Register(ThisAsSharedRef);
}
};
class FRegistryObject
{
// 此函数将接受到FMyBaseClass或其子类的TSharedRef或TSharedPtr。
void Register(TSharedRef<FMyBaseClass>);
};
1. FRegistryObject::Register(TSharedRef<FMyBaseClass>)的参数是FMyBaseClass的一个共享指针或引用,因此需要把FMyBaseClass的对象转变为共享指针或引用,所以FMyBaseClass需要继承TSharedFromThis。
2.在类FMyBaseClass中,TSharedRef<FMyBaseClass> ThisAsSharedRef = AsShared();
返回了对象的共享指针或引用。
3.在类FMyDerivedClass中, TSharedRef<FMyDerivedClass> AsSharedRef = SharedThis(this);
返回了对象的共享指针或引用。因为该类是FMyBaseClass的子类,AsShared()的话会返回
TSharedRef<FMyBaseClass>
2.共享指针
声明和初始化
// 创建一个空白的共享指针
TSharedPtr<FMyObjectType> EmptyPointer;
// 为新对象创建一个共享指针
TSharedPtr<FMyObjectType> NewPointer(new FMyObjectType());
// 从共享引用创建一个共享指针
TSharedRef<FMyObjectType> NewReference(new FMyObjectType());
TSharedPtr<FMyObjectType> PointerFromReference = NewReference;
// 创建一个线程安全的共享指针
TSharedPtr<FMyObjectType, ESPMode::ThreadSafe> NewThreadsafePointer = MakeShared<FMyObjectType, ESPMode::ThreadSafe>(MyArgs);
3.共享引用
共享引用 是一类强大且不可为空的 智能指针,
声明和初始化
//创建新节点的共享引用
TSharedRef<FMyObjectType> NewReference = MakeShared<FMyObjectType>();
4.弱指针
声明、初始化和分配
//分配新的数据对象,并创建对其的强引用。
TSharedRef<FMyObjectType> ObjectOwner = MakeShared<FMyObjectType>();
//创建指向新数据对象的弱指针。
TWeakPtr<FMyObjectType> ObjectObserver(ObjectOwner);
引用:
https://docs.unrealengine.com/5.3/zh-CN/smart-pointers-in-unreal-engine/