Singleton模板为C 的基类

singleton template as base class in C++

本文关键字:基类 Singleton      更新时间:2023-10-16

根据c 单顿设计模式,我写了一个singleton模板

template <typename T>
class Singleton
{
    public:
        static T& getInstance()
        {
            static T instance;
            return instance;
        }
    protected:
        Singleton() {}
        ~Singleton() {}
    public:
        Singleton(Singleton const &) = delete;
        Singleton& operator=(Singleton const &) = delete;
};

然后我写了一个记录器singleton(第一个)

class Logger                            // not derived Singleton<Logger>
{
    friend class Singleton<Logger>;
    private:
        Logger(){};
        ~Logger(){};                          
    public:
        void print(void){std::cout << "hello" << std::endl;}
};
int main(void)
{
    Singleton<Logger>::getInstance().print(); // use Singleton<Logger>
    return 0;
}

,但我也可以(第二个)

class Logger:public Singleton<Logger>    // derived Singleton<Logger>
{
    friend class Singleton<Logger>;
    private:
        Logger(){};
        ~Logger(){};                          
    public:
        void print(void){std::cout << "hello" << std::endl;}
};
int main(void)
{
    Logger::getInstance().print();      // use Logger
    return 0;
}

然后我的问题是

  1. 我的单例模板正确吗?
  2. 如果单例模板正确,则两个记录器都是正确的?
  3. 第一个和第二个更好的区别,哪个更好?

更新
答案后,我了解到第一个允许有几个记录仪,并且singleton类似乎不需要。关于第二个i 省略驱动器,然后crumper子将产生默认的内线公共公共场所。这似乎更简洁,更有效。

class Logger:public Singleton<Logger>    // derived Singleton<Logger>
{
    friend class Singleton<Logger>;
    private:
        Logger(){};                       
    public:
        void print(void){std::cout << "hello" << std::endl;}
};
  1. 我的单例模板正确吗?

是的。

  1. 如果单例模板正确,则两个记录器都是正确的?

您的第一个片段允许使用复制构造函数的几个记录器。因此,在这方面,这是不正确的。

  1. 第一个和第二个更好的区别,哪个更好?

如果您修复了第一个摘要也可以禁止复制构造函数,那么您只错过了基本的getInstance,而您的Singleton类似乎不需要。

使用第二个片段,您甚至可以省略击曲线。

1)您的单例模板是正确的。

2)您的两个记录器都是正确的。但是第二个是不好的做法。因为没有必要从单例模板派生的记录器。您可以通过将此行放入第二个线上进行检查:

Singleton<Logger>::getInstance().print();

工作正常。

3)第一个更好。