(共享)指向Singelton的指针

时间:2016-01-21 09:58:01

标签: c++ singleton

我发现了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.
};

3 个答案:

答案 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无法使用,因此失败。