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?这可能会导致创建多个实例。考虑:

  • 线程1执行“
    (m_instance==0)
    ”并发现它为真
  • 线程2执行“
    (m_instance==0)
    ”并发现它为真
  • 线程1分配一个新的T
  • 线程2分配一个新的T

  • 然后其中一个覆盖另一个,并返回其中一个实例或另一个实例(取决于编译器优化等)

    从Singleton创建的每个模板类都将有自己的静态
    m_实例
    成员。。。这些不会在不同的类之间共享,因为在实例化模板时,它实际上会为每组模板参数生成不同的类。从执行继承的方式来看,这可能意味着您最终将为每个派生自它的类提供一个Singleton实例。也许这就是您的问题的原因?

    您的问题是您的模板将在多个编译单元中实例化,因为它是完全内联的。因此,在使用该模板的每个编译单元中,最终将创建一个单例(每个编译单元)。您需要的是强制全局链接,以便所有编译单元都引用相同的模板实例化。即将到来的C++标准将支持这一点。现在可以做的是在项目中禁用自动实例化,并手动实例化显式使用的模板。这样,当您在任何编译单元中使用模板时,您将生成一个对实现的未知引用,链接器可以从执行显式实例化的(一)个编译单元中满足该引用。

    关于如何实现单例的精彩讨论,在本文中,我们可以找到C++的线程安全性:如何强制全局链接?
    SomeClass::getInstance().doSomething();