通过将构造函数设为私有的 C++ 单例 class

C++ singleton class by making the constructor private

我试图通过使构造函数非 public 来使用该模式使 class 实际上成为一个单例。然而,当我测试它时,结果并不是我所期望的。如果只创建一个实例,value 对于引用应该是相同的,但显然,它们是不同的,如下所示。代码有什么问题?

代码:

class SortOfSingleton
{
public:
    static SortOfSingleton& getInstance();
    int value = 0;
private:
    SortOfSingleton(int value);
};

SortOfSingleton::SortOfSingleton(int value)
{
    std::cout << "Creating new instance."<< std::endl;
    this->value = value;
}

SortOfSingleton& SortOfSingleton::getInstance()
{
    static SortOfSingleton instance(5);
    return instance;
}


void main()
{
    auto instance1 = SortOfSingleton::getInstance();
    instance1.value = 100;
    std::cout << instance1.value << std::endl;

    auto instance2 = SortOfSingleton::getInstance();
    std::cout << instance2.value << std::endl;

实际输出:

Creating new instance.
100
5

预期输出:

Creating new instance.
100
100

auto 类型推导 包含引用。相反,每个 instance 变量将是它自己的对象的 copy

您必须明确使用 & 来定义引用:

auto& instance1 = SortOfSingleton::getInstance();

...

auto& instance2 = SortOfSingleton::getInstance();

关于这一点,您还需要通过删除复制构造函数和复制赋值运算符来禁止复制。您还应该禁止使用右值重载移动对象。