所以我正在使用供应商应用程序中的一些新代码,我发现对于他们的一个库,他们使用的是Singleton模式。在那里,他们使用Helper
来实例化单例。为什么这有必要?
库头文件:
Class LibExample {
public:
static LibExample* getInstance();
private:
class Helper {
public:
Helper() {
libExampleInstance = new LibExample();
}
~Helper() {
delete libExampleInstance;
}
LibExample* libExampleInstance;
};
static LibExample* m_instance;
LibExample();
virtual ~LibExample();
LibExample (const LibExample& ) {};
LibExample& operator=(const LibExample&) {
return *(LibExample::getInstance());
}
};
在.cpp文件中:
LibExample* LibExample::m_instance = NULL;
LibExample* LibExample::getInstance() {
static Helper instance;
if(m_instance == NULL) {
m_instance = instance.libExampleInstance;
int ret = m_instance->init();
if(ret < 0) {
m_instance = NULL;
}
}
return m_instance;
}
答案 0 :(得分:2)
他们在那里使用帮助者&#39;实例化单身人士。为什么这有必要?
不是。此处Helper
可用于m_instance == NULL
测试,并在首次使用init
时调用getInstance
,但init
可能已在{{1}中运行也是构造函数。可能有一个不明原因,但恕我直言,这个设计只是过于复杂。
你可以:
LibExample
修改强>
@SingerOfTheFall在评论中指出:
我认为这是为了实现某种类型的后期初始化:如果
Class LibExample { public: static LibExample* getInstance(); private: LibExample(); virtual ~LibExample(); LibExample (const LibExample& ) {}; LibExample& operator=(const LibExample&) { return *(LibExample::getInstance()); } }; LibExample* LibExample::getInstance() { static LibExample instance; static LibExample* p_instance = NULL; if(p_instance == NULL) { int ret = instance.init(); if(ret >= 0) { p_instance = &instance; } } return p_instance; }
第一次失败,单例本身不需要重新构建,它会尝试重新构建下次调用实例时初始化自己。
不需要init()
:我相应地修改了我的代码。