2011-04-05 35 views
2

我有一个singlton的问题。单身的静态可变位置

我应该在哪里声明单例类的静态成员?

为什么不这样工作

class singleton{ 

    private: 

    static singleton & m_singleton; 

    public: 

    static singleton& get_instance{ 

      return m_singleton; 
    } 

} 

,但我必须这样

class singleton{ 

    public: 

    static singleton& get_instance{ 

    static singleton & m_singleton; 

      return m_singleton; 
    } 

} 

有什么差异性?

我知道有另一种方法来使用指针,但现在我只是在谈论使用一个对象的情况。

另外还有一个问题,单身人士使用指针和引用有什么优点/缺点?

非常感谢!

+0

更多的信息在这里:http://stackoverflow.com/questions/1008019/c-singleton-design-pattern/1008289#1008289 – 2011-04-05 23:20:57

回答

5

在第一种情况下,当程序初始化时,在调用main()之前,构造单例(称为构造函数)。在这种情况下,您还需要在cpp文件中的某处定义静态变量。

在第二种情况下,首次调用函数时构造单例。请注意,由于函数中的静态变量初始化不是线程安全的,因此此实现不是线程安全的。如果两个线程都是第一次调用这个函数,那么您很可能会得到两个单例。

另请注意,您有第二个错误。没有初始化就无法定义参考。这

static SomeClass &var; 

不编译。您需要删除引用来创建类的实际实例,而不是引用,然后返回对其的引用。

如果在第二个示例中将静态变量定义为指针,则可以通过仔细初始化指针来避免我提到的线程问题。阅读更多关于它在this class article(那谈论Java,但核心问题是相同的)

+0

+1:一般同意。但是如果你将它改为指针,你会遇到破坏单例的问题。只需在需要它的平台(即不是gcc)上创建单例时添加锁就容易多了。 – 2011-04-05 23:19:59