• 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. }

  • 相关阅读:
    Java 网络编程之TCP(五):分析服务端注册OP_WRITE写数据的各种场景(三)
    ruoyi-vue(若依前后端分离版本)环境搭建 用eclipse 安装redis 后端配置 配置node环境 前端配置
    C语言编程陷阱(三)
    SQL如何对数据进行排序
    java使用stream流把集合中元素的属性空值赋值为0,BigDecimal类型属性使用reduce()自定义运算符,避免计算的时候导致报错
    开发一个训练LORA的WebUI
    【SemiDrive源码分析】【MailBox核间通信】53 - VIRTIO、/dev/vircan实现原理分析 及 代码实战
    暗月项目四
    Oracle 21版Database In-Memory LivaLabs实验(上)
    精美可视化:Python自动化生成漂亮的测试报告
  • 原文地址:https://blog.csdn.net/qqQQqsadfj/article/details/133076121