通过将构造函数设为私有的 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();
关于这一点,您还需要通过删除复制构造函数和复制赋值运算符来禁止复制。您还应该禁止使用右值重载移动对象。
我试图通过使构造函数非 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();
关于这一点,您还需要通过删除复制构造函数和复制赋值运算符来禁止复制。您还应该禁止使用右值重载移动对象。