• C++ 单例模式


    1. #include "iostream"
    2. using namespace std;
    3. class AloneClass {
    4. public:
    5. static AloneClass* Instance() {
    6. if (aloneClass == nullptr) {
    7. aloneClass = new AloneClass();
    8. }
    9. return aloneClass;
    10. }
    11. void PrintS() {
    12. cout << 234 << endl;
    13. }
    14. private:
    15. AloneClass() {
    16. }
    17. ~AloneClass();
    18. AloneClass(const AloneClass& alone);
    19. AloneClass& operator=(const AloneClass& alone);
    20. private:
    21. static AloneClass* aloneClass;
    22. };
    23. AloneClass* AloneClass::aloneClass = nullptr;
    24. int main() {
    25. AloneClass::Instance()->PrintS();
    26. return 0;
    27. }

    这种情况是不是多线程的情况,多线程若需要单例,则需要调用call_once函数

    1. #include "iostream"
    2. using namespace std;
    3. template<typename Type>
    4. class SingleClass
    5. {
    6. public:
    7. static Type* Instance() {
    8. if (singleClass == nullptr) {
    9. singleClass = new Type();
    10. }
    11. return singleClass;
    12. }
    13. private:
    14. SingleClass() {}
    15. ~SingleClass() {}
    16. SingleClass(const Type& single) {}
    17. SingleClass& operator= (const Type& single) {}
    18. private:
    19. static Type* singleClass;
    20. };
    21. template<typename Type>
    22. Type* SingleClass::singleClass = nullptr;
    23. class B {
    24. friend SingleClass<B>;
    25. public:
    26. void Print() {
    27. cout << 1234 << endl;
    28. }
    29. private :
    30. B() {}
    31. ~B() {}
    32. B(const B& b) {}
    33. B& operator=(const B& b) {}
    34. };
    35. int main() {
    36. SingleClass<B>::Instance()->Print();
    37. return 0;
    38. }

    修改成为模板形式


    UE版本

    1. // Copyright Epic Games, Inc. All Rights Reserved.
    2. #pragma once
    3. #include "CoreMinimal.h"
    4. #include "mutex"
    5. template<typename Type>
    6. class SingleClass
    7. {
    8. public:
    9. static Type* Instance() {
    10. std::lock_guard<std::mutex> lockGuard(mtx);
    11. if (singleClass == nullptr) {
    12. singleClass = NewObject<Type>();
    13. }
    14. return singleClass;
    15. }
    16. private:
    17. SingleClass() {}
    18. ~SingleClass() {}
    19. SingleClass(const Type& single) {}
    20. SingleClass& operator= (const Type& single) {}
    21. static std::mutex mtx;
    22. private:
    23. static Type* singleClass;
    24. };
    25. template<typename Type>
    26. Type* SingleClass::singleClass = nullptr;
    27. template<typename Type>
    28. std::mutex SingleClass<Type>::mtx;

    这里加了锁,防止多线程造成两次调用Instance实例出两个实例

    1. // Copyright Epic Games, Inc. All Rights Reserved.
    2. #pragma once
    3. #include "CoreMinimal.h"
    4. #include "SingleClass.h"
    5. #include "GameFramework/Actor.h"
    6. #include "CreateActorFactory.generated.h"
    7. UCLASS()
    8. class ACreateActorFactory : public AActor
    9. {
    10. GENERATED_BODY()
    11. friend class SingleClass;
    12. public:
    13. void Print();
    14. private:
    15. ACreateActorFactory() {}
    16. ~ACreateActorFactory() {}
    17. };
    1. // Copyright Epic Games, Inc. All Rights Reserved.
    2. #include "CreateActorFactory.h"
    3. void ACreateActorFactory::Print() {
    4. GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, "324");
    5. }
    1. // Copyright Epic Games, Inc. All Rights Reserved.
    2. #include "ActorBase.h"
    3. #include "SingleClass.h"
    4. #include "CreateActorFactory.h"
    5. AActorBase::AActorBase() {
    6. }
    7. void AActorBase::BeginPlay() {
    8. Super::BeginPlay();
    9. SingleClass::Instance()->Print();
    10. }

  • 相关阅读:
    My Forty-fifth - Page - 修剪二叉搜索树- By Nicolas
    论文阅读”Graph attention networks“(ICLR2018)
    利用FME读取Word中的表格
    windows使用虚拟机安装max系统
    【SpringBoot】之浅谈 SpringBoot 项目的创建
    小程序年度盘点&趋势预测
    ConcurrentHashMap源码解析 1.内部结构
    JSON-RPC跨域通信:Python服务器端解决方案与Js客户端 Mozilla扩展程序
    从开发流程看 PyQt5 入门
    【硬件异常黑盒子功能】成功使用LUA小程序实现类似MDK的硬件检测机制,并且更进一步锁异常位置,支持脱机运行
  • 原文地址:https://blog.csdn.net/qqQQqsadfj/article/details/133076121