我正在编写一个实用程序类库,其中许多是单例。我已经使用继承实现了它们:
template <class T>
class Singleton {
public:
T& getInstance() {
if(m_instance == 0) {
m_instance = new T;
}
return m_instance;
}
private:
static T* m_instance;
};
class SomeClass : public Singleton<SomeClass> {
public:
SomeClass() {}
virtual ~SomeClass() {}
void doSomething() {;}
};
显然这是一个简单的例子,而不是一个实际的类。无论如何,我发现使用以下代码:
SomeClass::getInstance().doSomething();
将创建多个 SomeClass 的实例。我认为这可能是因为它在我的库(.a)文件之外以及在内部使用。例如,我正在使用一个不是我自己编写的 UI 库,它是单独编译的,我正在对其进行添加。其中一些添加使用了我的 .a 库中也使用的单例。
单独编译会导致这种情况吗?还有什么?
我设法解决这个问题的唯一方法是在我的 main.cpp 文件中创建一个全局对象,我用我需要的任何单例初始化它。然后所有代码通过如下调用访问这个通用全局对象:
GlobalObject::getSomeClass().doSomething()
我讨厌每次创建另一个单例时都必须向这个对象添加一个额外的方法。另外,使用第一种访问方法,语法似乎更清晰、更熟悉:
SomeClass::getInstance().doSomething();
如果您有任何想法,意见等,请告诉我。
谢谢。