就个人而言,我不喜欢这种方式来实例化 Singleton 类。我喜欢使用一个init
函数来显式地创建类,并使用一个Done
函数来释放。模板化也让一切变得更整洁。至于加载文件,这应该是子类的方法。
// Singleton.h
template<class T>
class Singleton
{
public:
static void Init() { m_pInst = new T(); }
static void Done() { delete m_pInst; }
static T& GetInstance() { assert(m_pInst); return *m_pInst; }
protected:
Singleton() {}
private:
Singleton(const Singleton&) {}
private:
static T* m_pInst;
}
// Foo.h
class Foo : public Singleton<Foo>
{
public:
void LoadConfig(const char* path) {} // Load config.
}
// Foo.cpp
Foo* Singleton<Foo>::m_pInst = NULL;