共享引用

不能为未初始化或分配为空的智能指针类型。

Windows
MacOS
Linux

共享引用 是一类强大且不可为空的 智能指针,其被用于引擎的 Uobject 系统外的数据对象。此意味无法重置共享引用、向其指定空对象,或创建空白引用。因此共享引用固定包含有效对象,甚至未拥有 IsValid 方法。在共享引用和 [共享指针](Shared Pointers) 间选择时,除非需要空白或可为空的对象,否则共享引用为优先选项。如需可能空白或可为空的引用,则应使用共享指针。

与标准的C++引用不同,可在创建后将共享引用重新指定到另一对象。

声明和初始化

共享引用不可为空,因此初始化需要数据对象。在无有效对象的情况下尝试创建的共享引用将不会编译,并尝试将共享引用初始化为空指针变量。

//创建新节点的共享引用
TSharedRef<FMyObjectType> NewReference = MakeShared<FMyObjectType>();

在无有效对象的情况下尝试创建的共享引用将不会编译:

//以下两者均不会编译:
TSharedRef<FMyObjectType> UnassignedReference;
TSharedRef<FMyObjectType> NullAssignedReference = nullptr;
//以下会编译,但如NullObject实际为空则断言。
TSharedRef<FMyObjectType> NullAssignedReference = NullObject;

共享指针和共享引用间的转换

共享指针和共享引用间的转换十分常见。共享引用会隐式转换为共享指针,并为新共享指针引用有效对象提供额外保证。使用普通语法处理转换:

TSharedPtr<FMyObjectType> MySharedPointer = MySharedReference;

如共享指针引用非空对象,即可使用 共享指针 函数 ToSharedRef,在共享指针中创建共享引用。尝试在空共享指针中创建共享引用,将导致程序断言。

//在取消引用前,确保共享指针为有效,避免潜在断言。
If (MySharedPointer.IsValid())
{
    MySharedReference = MySharedPointer.ToSharedRef();
}

比较

可测试共享引用彼此是否相等。在此情况下,相等表示引用相同对象。

TSharedRef<FMyObjectType> ReferenceA, ReferenceB;
if (ReferenceA == ReferenceB)
{
    // ...
}
Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback