Choose your operating system:
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)
{
// ...
}