c++ - 更好地理解 C++ 中的 Singleton 类

标签 c++ reference singleton

<分区>

我编写了一个非常简单的程序来实现一个通用的 Singleton 类,如下所示:

namespace core
{
    template <typename T>
    class Singleton
    {
        protected:
            Singleton(void);
            Singleton(Singleton const &other);
            virtual ~Singleton(void);
        public:
            Singleton &operator=(Singleton const &other);
            static T *GetSingletonPtr(void);
            static T &GetSingleton(void);
            static void DestroySingleton(void);
        private:
            static T *m_pInstance;
            static T m_Instance;
    };

    //Globals initialization

    template <typename T>
    T *Singleton<T>::m_pInstance = NULL;

    template <typename T>
    T Singleton<T>::m_Instance = T();

    //Initialization

    template <typename T>
    Singleton<T>::Singleton(void)
    {

    }

    template <typename T>
    Singleton<T>::Singleton(Singleton<T> const &other)
    {
        *this = other;
    }

    //Destruction

    template <typename T>
    Singleton<T>::~Singleton(void)
    {

    }

    //Surcharges

    template <typename T>
    Singleton<T> &Singleton<T>::operator=(Singleton<T> const &other)
    {
        if (&other != this)
        {
            m_pInstance = other.m_pInstance;
            m_Instance = other.m_Instance;
        }
        return (*this);
    }

    //Others

    template <typename T>
    T *Singleton<T>::GetSingletonPtr(void)
    {
        if (m_pInstance == NULL)
            m_pInstance = new T();
        return (m_pInstance);
    }

    template <typename T>
    T &Singleton<T>::GetSingleton(void)
    {
        return (m_Instance);
    }

    template <typename T>
    void Singleton<T>::DestroySingleton(void)
    {
        if (m_pInstance != NULL)
        {
            delete (m_pInstance);
            m_pInstance = NULL;
        }
    }
}

然后,我在单例类“TestSingleton”的构造函数中使用日志“constructor:toto”编写了以下代码。

#include <iostream>
#include <Singleton.hpp>

class TestSingleton : public core::Singleton<TestSingleton>
{
        friend class core::Singleton<TestSingleton>;
    private:
        TestSingleton(void)
        {
            std::cout << "constructor:toto" << std::endl;
        }
};

class HandleSingleton
{
    public:
        void Handle()
        {
            TestSingleton &test = TestSingleton::GetSingleton();
        }
};

int main(void)
{
    getchar();
    return (0);
}

输出如下:

$> constructor:toto

我不明白为什么即使未调用初始化此引用的方法(此处为“Handle”方法),也会初始化带有引用的变量?

预先感谢您的帮助!

最佳答案

您的 Singleton 类使用 T 的静态实例。该实例将在程序启动期间在调用 main 之前初始化。

粘贴中的以下代码初始化实例:

//Globals initialization

// […]

template <typename T>
T Singleton<T>::m_Instance = T();

关于c++ - 更好地理解 C++ 中的 Singleton 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23734602/

相关文章:

c++ - 为什么类型别名决定输出是左值还是右值?

Scala 伴生对象不是单例

ruby - 我如何混入 Singleton 来创建一个接受初始化参数的类?

c++ - char vector 可以越界吗?

c++ - 如何以编程方式清理 linux 中的页面缓存

c# - 按引用传递引用与按值传递引用 - C#

.net - 如何管理 C#/.NET 项目中的版本依赖项?

c# - 垃圾收集器什么时候收集单例?

c# - 为 .NET 应用启用高性能 GPU

c++ - 从给定元素以外的 std::vector 中选择一个元素