UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ConstructorHelpers.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 ConstructorHelpers.h: Constructor helper templates
5=============================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
11#include "UObject/GCObject.h"
12
14{
15 template<typename T>
16 inline T* FindOrLoadObject( FString& PathName, uint32 LoadFlags )
17 {
18 // If there is no dot, add a dot and repeat the object name.
20 PathName.FindChar( TCHAR('.'), PackageDelimPos );
22 {
24 PathName.FindLastChar( TCHAR('/'), ObjectNameStart );
26 {
27 const FString ObjectName = PathName.Mid( ObjectNameStart+1 );
28 PathName += TCHAR('.');
30 }
31 }
32
33 UClass* Class = T::StaticClass();
34 Class->GetDefaultObject(); // force the CDO to be created if it hasn't already
35 T* ObjectPtr = LoadObject<T>(NULL, *PathName, nullptr, LoadFlags);
36 if (ObjectPtr)
37 {
38 ObjectPtr->AddToRoot();
39 }
40 return ObjectPtr;
41 }
42
43 template<>
45
46 inline UClass* FindOrLoadClass(FString& PathName, UClass* BaseClass)
47 {
48 // If there is no dot, add ".<object_name>_C"
50 PathName.FindChar(TCHAR('.'), PackageDelimPos);
52 {
54 PathName.FindLastChar(TCHAR('/'), ObjectNameStart);
56 {
57 const FString ObjectName = PathName.Mid(ObjectNameStart + 1);
58 PathName += TCHAR('.');
60 PathName += TCHAR('_');
61 PathName += TCHAR('C');
62 }
63 }
65 if (LoadedClass)
66 {
67 LoadedClass->AddToRoot();
68 }
69 return LoadedClass;
70 }
71}
72
74{
75public:
76 template<class T>
77 struct FObjectFinder : public FGCObject
78 {
81 {
82 CheckIfIsInConstructor(ObjectToFind);
83 FString PathName(ObjectToFind);
85
86 Object = ConstructorHelpersInternal::FindOrLoadObject<T>(PathName, InLoadFlags);
87 ValidateObject( Object, PathName, ObjectToFind );
88 }
89 bool Succeeded() const
90 {
91 return !!Object;
92 }
93
94 virtual void AddReferencedObjects( FReferenceCollector& Collector ) override
95 {
96 Collector.AddReferencedObject(Object);
97 }
98
99 virtual FString GetReferencerName() const override
100 {
101 return TEXT("FObjectFinder");
102 }
103 };
104
105 template<class T>
107 {
108 private:
109 TObjectPtr<T> Object;
110 const TCHAR* ObjectToFind;
111 uint32 LoadFlags;
112 public:
114 : Object(nullptr)
115 , ObjectToFind(InObjectToFind)
116 , LoadFlags(InLoadFlags)
117 {
118 }
119 T* Get()
120 {
121 if (!Object && ObjectToFind)
122 {
123 CheckIfIsInConstructor(ObjectToFind);
124 FString PathName(ObjectToFind);
126
127 Object = ConstructorHelpersInternal::FindOrLoadObject<T>(PathName, LoadFlags);
128
129 bool WarnMissing = (LoadFlags & (LOAD_Quiet | LOAD_NoWarn)) == 0;
130
131 if (Object || WarnMissing)
132 {
133 ValidateObject(Object, PathName, ObjectToFind);
134 }
135
136 ObjectToFind = nullptr; // don't try to look again
137 }
138 return Object;
139 }
141 {
142 return !!Get();
143 }
144
145 virtual void AddReferencedObjects( FReferenceCollector& Collector ) override
146 {
147 Collector.AddReferencedObject(Object);
148 }
149
150 virtual FString GetReferencerName() const override
151 {
152 return TEXT("FObjectFinderOptional");
153 }
154 };
155
156 template<class T>
157 struct FClassFinder : public FGCObject
158 {
161 {
162 CheckIfIsInConstructor(ClassToFind);
163 FString PathName(ClassToFind);
166 ValidateObject(*Class, PathName, *PathName);
167 }
169 {
170 return !!*Class;
171 }
172
173 virtual void AddReferencedObjects( FReferenceCollector& Collector ) override
174 {
175 Collector.AddReferencedObject(Class.GetGCPtr());
176 }
177
178 virtual FString GetReferencerName() const override
179 {
180 return TEXT("FClassFinder");
181 }
182 };
183
184public:
186 static COREUOBJECT_API void StripObjectClass( FString& PathName, bool bAssertOnBadPath = false );
187
188private:
189 static void ValidateObject(UObject *Object, const FString& PathName, const TCHAR* ObjectToFind)
190 {
191 if (!Object)
192 {
193 FailedToFind(ObjectToFind);
194 }
195#if UE_BUILD_DEBUG
196 else
197 {
198 CheckFoundViaRedirect(Object, PathName, ObjectToFind);
199 }
200#endif
201 }
202
203 static COREUOBJECT_API void FailedToFind(const TCHAR* ObjectToFind);
204 static COREUOBJECT_API void CheckFoundViaRedirect(UObject *Object, const FString& PathName, const TCHAR* ObjectToFind);
205 static COREUOBJECT_API void CheckIfIsInConstructor(const TCHAR* ObjectToFind);
206};
207
208
#define NULL
Definition oodle2base.h:134
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ LOAD_None
No flags.
Definition ObjectMacros.h:69
@ LOAD_Quiet
No log warnings.
Definition ObjectMacros.h:83
@ LOAD_NoWarn
Don't display warning if load fails.
Definition ObjectMacros.h:71
UClass * StaticLoadClass(UClass *BaseClass, UObject *InOuter, FStringView InName, FStringView Filename, uint32 LoadFlags, UPackageMap *Sandbox)
Definition UObjectGlobals.cpp:1439
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition GCObject.h:128
Definition UObjectGlobals.h:2492
Definition SubclassOf.h:30
Definition Class.h:3793
Definition Object.h:95
Definition Package.h:216
Definition ConstructorHelpers.cpp:7
UPackage * FindOrLoadObject< UPackage >(FString &PathName, uint32 LoadFlags)
Definition ConstructorHelpers.cpp:10
T * FindOrLoadObject(FString &PathName, uint32 LoadFlags)
Definition ConstructorHelpers.h:16
UClass * FindOrLoadClass(FString &PathName, UClass *BaseClass)
Definition ConstructorHelpers.h:46
Definition ConstructorHelpers.h:158
bool Succeeded()
Definition ConstructorHelpers.h:168
virtual void AddReferencedObjects(FReferenceCollector &Collector) override
Definition ConstructorHelpers.h:173
virtual FString GetReferencerName() const override
Definition ConstructorHelpers.h:178
FClassFinder(const TCHAR *ClassToFind)
Definition ConstructorHelpers.h:160
TSubclassOf< T > Class
Definition ConstructorHelpers.h:159
Definition ConstructorHelpers.h:107
FObjectFinderOptional(const TCHAR *InObjectToFind, uint32 InLoadFlags=LOAD_None)
Definition ConstructorHelpers.h:113
T * Get()
Definition ConstructorHelpers.h:119
bool Succeeded()
Definition ConstructorHelpers.h:140
virtual void AddReferencedObjects(FReferenceCollector &Collector) override
Definition ConstructorHelpers.h:145
virtual FString GetReferencerName() const override
Definition ConstructorHelpers.h:150
Definition ConstructorHelpers.h:78
virtual FString GetReferencerName() const override
Definition ConstructorHelpers.h:99
TObjectPtr< T > Object
Definition ConstructorHelpers.h:79
virtual void AddReferencedObjects(FReferenceCollector &Collector) override
Definition ConstructorHelpers.h:94
bool Succeeded() const
Definition ConstructorHelpers.h:89
FObjectFinder(const TCHAR *ObjectToFind, uint32 InLoadFlags=LOAD_None)
Definition ConstructorHelpers.h:80
Definition ConstructorHelpers.h:74
static COREUOBJECT_API void StripObjectClass(FString &PathName, bool bAssertOnBadPath=false)
Definition UObjectGlobals.cpp:5095
Definition ObjectPtr.h:488