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

  • 相关阅读:
    ipython一些使用方法
    栅形状的影响及可靠性的优化
    DevOps推广实践总结
    网站文章采集器-万能文章采集器
    拓端tecdat|Python之LDA主题模型算法应用
    Allegro172版本DFM规则之Copper Features
    第三十六章 使用 CSP 进行基于标签的开发 - 使用尽可能少的#server和#call调用
    uniapp启动图延时效果,启动图的配置
    Python3.9标准库math中的函数汇总介绍(53个函数和5个常数)
    手机LiDAR-based激光雷达标定板提高无人汽车智能化程度
  • 原文地址:https://blog.csdn.net/qqQQqsadfj/article/details/133076121