【发布时间】:2017-04-06 05:26:55
【问题描述】:
以下定义单例的方法有什么不同或具体建议吗?
在 1 中,单例对象是类私有静态,但在 2 中,它是文件静态。
注意:m_initedObj1 只是用来表明类有状态,用例是多次调用这个singleton->DoSomething(),不需要再次初始化这个对象。
1)
// header file
class Foo {
private:
static Foo* s_fooSingleton;
Foo();
Obj1 m_initedObj1;
public:
static Foo* Singleton();
static void ClearSingleton();
Bar DoSomething(...);
};
// cpp file
Foo* Foo::s_fooSingleton = nullptr;
Foo::Foo() { m_initedObj1 = InitObj1Somewhere(); }
/*static*/ Foo* Foo::Singleton()
{
if(!Foo::s_fooSingleton)
Foo::s_fooSingleton = new Foo();
return Foo::s_fooSingleton;
}
/*static*/ void Foo::ClearSingleton()
{
if(Foo::s_fooSingleton)
delete Foo::s_fooSingleton;
Foo::s_fooSingleton = nullptr;
}
Bar Foo::DoSomething(...) { // do something }
2)
// header file
class Foo {
private:
Foo();
Obj1 m_initedObj1;
public:
static Foo* Singleton();
static void ClearSingleton();
Bar DoSomething(...);
};
// cpp file
static Foo* s_fooSingleton = nullptr;
Foo::Foo() { m_initedObj1 = InitObj1Somewhere(); }
/*static*/ Foo* Foo::Singleton()
{
if(!s_fooSingleton)
s_fooSingleton = new Foo();
return s_fooSingleton;
}
/*static*/ void Foo::ClearSingleton()
{
if(s_fooSingleton)
delete s_fooSingleton;
s_fooSingleton = nullptr;
}
Bar Foo::DoSomething(...) { // do something }
【问题讨论】:
-
in 2) 其他类方法可以修改s_fooSingleton
-
使用 Scott Meyer 的单例。
-
或者不要使用单例 ;-)
-
@JerryGoyal 是的,但是假设这个文件只有这个类,即使有,也不是什么大问题。
-
@GuillaumeRacicot,是的,我知道从 C++11 开始是线程安全的。但是对于上述情况,有什么区别吗?
标签: c++