我对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 :(得分:5)
在第一种情况下,在程序初始化之前,在调用main()
之前构造单例(构造函数被调用)。在这种情况下,您还需要在cpp文件中的某处定义静态变量。
在第二种情况下,在首次调用函数时构造单例。请注意,此实现不是线程安全的,因为函数中的静态变量初始化不是线程安全的。如果两个线程调用此函数的次数似乎是第一次,那么你很可能会得到两个单例。
另请注意,第二个错误。没有初始化,您无法定义参考。此
static SomeClass &var;
不编译。您需要删除引用以创建类的实际实例,而不是引用,然后返回对它的引用。
如果在第二个示例中将静态变量定义为指针,则可以通过仔细初始化指针来避免我提到的线程问题。在this class article中了解更多相关信息(关于Java,但核心问题是相同的)