共有の参照 は、エンジンの UObject
システム外のデータ オブジェクト用の non-nullable 型の スマート ポインタ です。つまり、共有の参照をリセットしたり、null オブジェクトを代入したり、空の共有の参照を作成することはできません。このため、共有の参照には常に有効なオブジェクトが含まれ、IsValid
メソッドすら含みません。共有の参照と 共有のポインタ のどちらかを選ぶのであれば、空のオブジェクトか Nullable 型オブジェクトが必要な場合以外は共有の参照を選ぶとよいでしょう。空のオブジェクトか Nullable 型の参照が必要な場合は共有のポインタを使用してください。
標準の C++ リファレンスとは異なり、共有の参照は作成後に他のオブジェクトへの再割り当てが可能です。
宣言と初期化
共有の参照は non-nullable なので、初期化にデータ オブジェクトを必要とします。有効なオブジェクトをもたたない共有の参照の作成を試みるとコンパイルせず、共有の参照をヌルポインタ変数に初期化しようとします。
// 新しいノートに共有の参照を作成します。
TSharedRef<FMyObjectType> NewReference = MakeShared<FMyObjectType>();
有効なオブジェクトをもたたない共有の参照の作成を試みるとコンパイルされません。
// これらのいずれもコンパイルされません。
TSharedRef<FMyObjectType> UnassignedReference;
TSharedRef<FMyObjectType> NullAssignedReference = nullptr;
// これはコンパイルされますが、NullObject が実際に null であるかどうかをアサートします。
TSharedRef<FMyObjectType> NullAssignedReference = NullObject;
共有のポインタと共有の参照間の変換
共有のポインタと共有の参照間での変換は一般的です。共有の参照は暗示的に共有のポインタへ変換し、新しい共有のポインタは有効なオブジェクトを参照するという保証が追加されています。変換は通常の記法で処理されます。
TSharedPtr<FMyObjectType> MySharedPointer = MySharedReference;
共有のポインタが non-null オブジェクトを参照している限り、Shared Pointer
関数の ToSharedRef
を使って共有のポインタから共有の参照を作成できます。null の共有のポインタから共有の参照を作成しようとするとアサートに問題が発生します。
// アサーションの可能性を避けるため、逆参照する前に共有のポインタが有効であることを確認する。
If (MySharedPointer.IsValid())
{
MySharedReference = MySharedPointer.ToSharedRef();
}
比較
共有の参照同士で等値をテストすることができます。ここでの等値の定義は、同じオブジェクトを参照していることです。
TSharedRef<FMyObjectType> ReferenceA, ReferenceB;
if (ReferenceA == ReferenceB)
{
// ...
}