C++ 多个单例实例
我正在编写一个实用程序类库,其中许多是单例的。我已经使用继承实现了它们:C++ 多个单例实例,c++,singleton,code-separation,C++,Singleton,Code Separation,我正在编写一个实用程序类库,其中许多是单例的。我已经使用继承实现了它们: template <class T> class Singleton { public: T& getInstance() { if(m_instance == 0) { m_instance = new T; } return m_instance; }
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的多个实例。我想这可能是因为它在我的库(.a)文件外部和内部使用。例如,我使用的UI库不是我自己编写的,它是单独编译的,并且我正在添加它。其中一些添加使用了单例,这也在my.a库中使用
是单独编译导致的吗?还有别的吗
我解决这个问题的唯一方法是在main.cpp文件中创建一个全局对象,并使用所需的任何单例进行初始化。然后,所有代码通过以下调用访问此公共全局对象:
GlobalObject::getSomeClass().doSomething()
我讨厌每次创建另一个单例时都必须向这个对象添加一个附加方法。另外,使用first access方法时,语法似乎更清晰、更熟悉:
SomeClass::getInstance().doSomething();
如果你有任何想法、意见等,请告诉我
谢谢。是否有多个线程同时访问getInstance?这可能会导致创建多个实例。考虑:
(m_instance==0)
”并发现它为真(m_instance==0)
”并发现它为真然后其中一个覆盖另一个,并返回其中一个实例或另一个实例(取决于编译器优化等)从Singleton创建的每个模板类都将有自己的静态
m_实例
成员。。。这些不会在不同的类之间共享,因为在实例化模板时,它实际上会为每组模板参数生成不同的类。从执行继承的方式来看,这可能意味着您最终将为每个派生自它的类提供一个Singleton实例。也许这就是您的问题的原因?您的问题是您的模板将在多个编译单元中实例化,因为它是完全内联的。因此,在使用该模板的每个编译单元中,最终将创建一个单例(每个编译单元)。您需要的是强制全局链接,以便所有编译单元都引用相同的模板实例化。即将到来的C++标准将支持这一点。现在可以做的是在项目中禁用自动实例化,并手动实例化显式使用的模板。这样,当您在任何编译单元中使用模板时,您将生成一个对实现的未知引用,链接器可以从执行显式实例化的(一)个编译单元中满足该引用。关于如何实现单例的精彩讨论,在本文中,我们可以找到C++的线程安全性:如何强制全局链接?
SomeClass::getInstance().doSomething();