本文章由cartzhang编写,转载请注明出处。 所有权利保留。
作者:cartzhang
单例使用目的:
一个类有且仅有一个实例。
防止有多个实例。
防止被变量在任意代码中被修改。
1. 函数内部静态变量
.h
/** Singleton access, platform specific, also calls PreInit() **/
static IFileManager& Get();
.cpp
IFileManager& IFileManager::Get()
{
static TUniquePtr<FFileManagerGeneric> AutoDestroySingleton;
if( !AutoDestroySingleton )
{
AutoDestroySingleton = MakeUnique<FFileManagerGeneric>();
}
return *AutoDestroySingleton;
}
2. 静态变量
.h
ENGINE_API static struct FStreamingManagerCollection& Get();
.cpp
// 静态变量
static FStreamingManagerCollection* StreamingManagerCollection = nullptr;
FStreamingManagerCollection& IStreamingManager::Get()
{
if (StreamingManagerCollection == nullptr)
{
StreamingManagerCollection = new FStreamingManagerCollection();
}
return *StreamingManagerCollection;
}
同样还有其他
FAssetEditorManager* FAssetEditorManager::Instance = NULL;
FAssetEditorManager& FAssetEditorManager::Get()
{
if (Instance == NULL)
{
Instance = new FAssetEditorManager();
}
return *Instance;
}
3.其他Instance 存放指针
常用的是GameInstance.
自定义的GameInstance,在头文件添加一个AAAManager的指针, AAAManager* TestAAManager。
在自定义的GameInstance.cpp中实现一下获取接口即可。
UAAManager* GetAAAManager()
{
if(TestAAManager == nullptr)
{
TestAAManager = NewObject<UAAManager>(this);
}
return TestAAManager;
}
在AAAManager中实现一个Get()静态接口函数,就是单例的入口。
UAAManager* UAAManager::Get(UObject* ContextObject)
{
TestGameInstance* GameInstance = TestGameInstance::Get(ContextObject);
if (GameInstacne)
{
return GameInstance->GetAAAManager();
}
return nullptr;
}
GameInstance 是从GetWorld()->GetGameInstance().
所以是跟当前Level的world唯一绑定的。
若有问题,请多多指教!