我发现了Singleton的这个实现。 如何制作指针或共享指针?`
为什么这不起作用? auto test = Singleton :: Instance();
class Singleton
{
public:
static Singleton & Instance()
{
static Singleton myInstance;
return myInstance;
}
// delete copy and move constructors and assign operators
Singleton(Singleton const&) = delete; // Copy construct
Singleton(Singleton&&) = delete; // Move construct
Singleton& operator=(Singleton const&) = delete; // Copy assign
Singleton& operator=(Singleton &&) = delete; // Move assign
// Any other public methods
protected:
Singleton()
{
}
~Singleton()
{
}
// And any other protected methods.
};
答案 0 :(得分:1)
为什么这不起作用? auto test = Singleton :: Instance();
如果您查看编译错误,它会告诉您。
main.cpp:31:37: error: use of deleted function 'Singleton::Singleton(const Singleton&)'
您正在尝试复制该对象。但是复制构造函数被删除,因此该类型不可复制。
您可能打算引用而不是副本:
auto& test = Singleton::Instance();
如何制作一个指针......对此?
您可以通过使用address-of运算符来获取指向单例的指针:
auto* test = &Singleton::Instance();
或共享指针
除非使用特殊的删除器,否则不能使用静态存储的对象共享指针,但这种共享指针几乎没用。由于您的单例具有静态存储,因此您不希望使用共享指针。您可以修改单例以保持静态存储的共享指针到动态分配的对象。然后你可以有一个共享指针。
答案 1 :(得分:0)
为什么不将共享指针作为类的成员,并返回?
所以你有
shared_ptr<Singleton> Instance()
{
if(!myInstance)
{
myInstance.reset(new Singleton());
}
return myInstance;
}
private:
shared_ptr<Singleton> myInstance;
答案 2 :(得分:0)
原始指针:Singleton* ptr = &Singleton::Instance();
或auto ptr = &Singleton::Instance();
参考:Singleton& ref = Singleton::Instance();
或auto& ref = Singleton::Instance();
您不应该使用共享指针(因为您没有单独的对象)。并非相应地改变单身人士类别。
为什么您的代码无法正常工作:auto
将类型推断为值类型并尝试复制instance()
的结果。由于Singleton
无法使用,因此失败。