智能指针介绍

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/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值