如何在没有复制构造函数的情况下使用 Meyer 的单例?
How to use Meyer's singleton without copy constructor?
这就是有人提到的迈耶单例。
static Singleton& getinstance()
{
static Singleton s_obj;
return s_obj;
}
但是用户如何使用这个 getinstace() API?
如果我这样用的话
Singleton myobj = getinstance();
我真的会复制 s_obj
对吧?
所以我现在有2个实例myobj
和s_obj
,这违反了单例的目的。
谁能解释一下如何正确理解 Meyer 的单例?
关键是,你删除了复制构造函数、移动构造函数、复制赋值运算符、移动赋值运算符,然后将可用的构造函数设为私有,这样其他人就无法复制它:
class Singleton
{
public:
Singleton(Singleton const&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(Singleton const&) = delete;
Singleton& operator=(Singleton&&) = delete;
static auto& instance()
{
static Singleton obj;
return obj;
}
private:
Singleton() { /* ... */ }
};
int
main()
{
auto& ref = Singleton::instance(); // OK
auto copy = Singleton::instance(); // Won't compile
}
这就是有人提到的迈耶单例。
static Singleton& getinstance()
{
static Singleton s_obj;
return s_obj;
}
但是用户如何使用这个 getinstace() API?
如果我这样用的话
Singleton myobj = getinstance();
我真的会复制 s_obj
对吧?
所以我现在有2个实例myobj
和s_obj
,这违反了单例的目的。
谁能解释一下如何正确理解 Meyer 的单例?
关键是,你删除了复制构造函数、移动构造函数、复制赋值运算符、移动赋值运算符,然后将可用的构造函数设为私有,这样其他人就无法复制它:
class Singleton
{
public:
Singleton(Singleton const&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(Singleton const&) = delete;
Singleton& operator=(Singleton&&) = delete;
static auto& instance()
{
static Singleton obj;
return obj;
}
private:
Singleton() { /* ... */ }
};
int
main()
{
auto& ref = Singleton::instance(); // OK
auto copy = Singleton::instance(); // Won't compile
}