シェアード リファレンス

未初期化、または NULL の代入が不可能なスマートポインタ型です。

Windows
MacOS
Linux

シェアード リファレンス は、エンジンの UObject システム外のデータ オブジェクト用の non-nullable 型の スマート ポインタ です。つまり、シェアード リファレンスをリセットしたり、null オブジェクトを代入したり、空のシェアード リファレンスを作成することはできません。このため、シェアード リファレンスには常に有効なオブジェクトが含まれ、IsValid メソッドすら含みません。シェアード リファレンスと シェアード ポインタ のどちらかを選ぶのであれば、空のオブジェクトか Nullable 型オブジェクトが必要な場合以外はシェアード リファレンスを選ぶとよいでしょう。空のオブジェクトか Nullable 型の参照が必要な場合はシェアード ポインタを使用してください。

標準の C++ リファレンスとは異なり、シェアード リファレンスは作成後に他のオブジェクトへの再割り当てが可能です。

宣言と初期化

シェアード リファレンスは non-nullable なので、初期化にデータ オブジェクトを必要とします。有効なオブジェクトをもたたないシェアード リファレンスの作成を試みるとコンパイルせず、シェアード リファレンスをヌルポインタ変数に初期化しようとします。

// Create a shared reference to a new node 
TSharedRef<FMyObjectType> NewReference = MakeShared<FMyObjectType>();

Attempting to create a Shared Reference without a valid object will not compile:

// Neither of these will compile:
TSharedRef<FMyObjectType> UnassignedReference;
TSharedRef<FMyObjectType> NullAssignedReference = nullptr;
// This will compile, but will assert if NullObject is actually null.
TSharedRef<FMyObjectType> NullAssignedReference = NullObject;

シェアード ポインタとシェアード リファレンス間の変換

シェアード ポインタとシェアード リファレンス間での変換は一般的です。シェアード リファレンスは暗示的にシェアード ポインタへ変換し、新しいシェアード ポインタは有効なオブジェクトを参照するという保証が追加されています。変換は通常の記法で処理されます。

TSharedPtr<FMyObjectType> MySharedPointer = MySharedReference;

シェアード ポインタが non-null オブジェクトを参照している限り、Shared Pointer 関数の ToSharedRef を使ってシェアード ポインタからシェアード リファレンスを作成できます。null のシェアード ポインタからシェアード リファレンスを作成しようとするとアサートに問題が発生します。

// Ensure your shared pointer is valid before dereferencing to avoid a potential assertion.
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