C++笔记之单例通过GetInstance传递参数

C++笔记之单例通过GetInstance传递参数

code review!

文章目录

  • C++笔记之单例通过GetInstance传递参数
    • 例1.普通指针的单例
    • 例2.结合智能指针和std::call_once
    • 例3.编译不通过的错误例子,在GetInstance内不可以使用std::make_shared来创建对象

例1.普通指针的单例

C++笔记之单例通过GetInstance传递参数_第1张图片

运行
在这里插入图片描述

代码

#include 
#include 

class Singleton {
  public:
    // 获取单例实例的静态函数,可以传递构造函数所需的参数
    static Singleton *GetInstance(const std::string &value) {
        if (!instance) {
            instance = new Singleton(value);
        }
        return instance;
    }

    void PrintValue() {
        std::cout << value << std::endl;
    }

  private:
    // 私有构造函数,防止直接实例化
    Singleton(const std::string &val) : value(val) {}

    static Singleton *instance;
    std::string value;
};

// 初始化静态成员变量
Singleton *Singleton::instance = nullptr;

int main() {
    Singleton *instance1 = Singleton::GetInstance("Instance 1");
    instance1->PrintValue(); // 输出:Instance 1

    Singleton *instance2 = Singleton::GetInstance("Instance 2");
    instance2->PrintValue(); // 输出:Instance 1,因为单例已经创建,不会再次创建新实例

    return 0;
}

例2.结合智能指针和std::call_once

C++笔记之单例通过GetInstance传递参数_第2张图片

使用 std::shared_ptrstd::call_once 来实现单例模式,并避免了调用私有构造函数:
在这个示例中,通过直接使用 new Singleton(value) 来创建 std::shared_ptr 的实例,这样就能够调用私有的构造函数。

运行
C++笔记之单例通过GetInstance传递参数_第3张图片

代码

#include 
#include 
#include 
#include 

class Singleton {
public:
    // 获取单例实例的静态函数,可以传递构造函数所需的参数
    static std::shared_ptr<Singleton> GetInstance(const std::string& value) {
        std::call_once(initFlag, [&]() {
            instance = std::shared_ptr<Singleton>(new Singleton(value));
        });
        return instance;
    }

    void PrintValue() {
        std::cout << value << std::endl;
    }

private:
    // 私有构造函数,防止直接实例化
    Singleton(const std::string& val) : value(val) {}

    static std::shared_ptr<Singleton> instance;
    static std::once_flag initFlag;
    std::string value;
};

// 初始化静态成员变量
std::shared_ptr<Singleton> Singleton::instance = nullptr;
std::once_flag Singleton::initFlag;

int main() {
    std::shared_ptr<Singleton> instance1 = Singleton::GetInstance("Instance 1");
    instance1->PrintValue(); // 输出:Instance 1

    std::shared_ptr<Singleton> instance2 = Singleton::GetInstance("Instance 2");
    instance2->PrintValue(); // 输出:Instance 1,因为单例已经创建,不会再次创建新实例

    return 0;
}

例3.编译不通过的错误例子,在GetInstance内不可以使用std::make_shared来创建对象

C++笔记之单例通过GetInstance传递参数_第4张图片

编译报错:
C++笔记之单例通过GetInstance传递参数_第5张图片

在 C++ 中,std::make_shared 会调用构造函数来创建对象,但是由于构造函数是私有的,会导致编译错误。

你可能感兴趣的:(c++,笔记,开发语言)