singleton template as base class in C++(C++中作为基类的Singleton模板)
                            本文介绍了C++中作为基类的Singleton模板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
                        
                        问题描述
根据C++ Singleton design pattern我编写了一个单例模板
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;
};
然后我编写了一个记录器单例(第一个)
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;
}
那么我的问题是
- 我的单身模板正确吗?
 - 如果单例模板正确,则两个记录器都正确?
 - 第一个和第二个的区别,哪个更好?
 
更新
在回答之后,我了解到第一个允许有多个记录器,并且singleton类似乎不需要。所以我放弃第一个。
关于第二个函数,我省略析构函数,然后编译器将生成一个缺省的内联公共函数。这样看起来更简洁、更高效。
class Logger:public Singleton<Logger>    // derived Singleton<Logger>
{
    friend class Singleton<Logger>;
    private:
        Logger(){};                       
    public:
        void print(void){std::cout << "hello" << std::endl;}
};
推荐答案
- 我的单身模板正确吗?
 
是的。
感谢复制构造函数,您的第一个代码段允许有多个记录器。 因此,在这一点上,它是不正确的。
- 如果单例模板正确,则两个记录器都正确?
 
- 第一个和第二个的区别,哪个更好?
 
如果将第一个代码段修复为同时禁止复制构造函数,则只缺少基本getInstance,并且您的Singleton类似乎不需要。
使用第二个代码段,您甚至可以省略析构函数。
这篇关于C++中作为基类的Singleton模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
				 沃梦达教程
				
			本文标题为:C++中作为基类的Singleton模板
				
        
 
            
        
             猜你喜欢
        
	     - XML Schema 到 C++ 类 2022-01-01
 - 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值 2021-01-01
 - 使用 __stdcall & 调用 DLLVS2013 中的 GetProcAddress() 2021-01-01
 - 将函数的返回值分配给引用 C++? 2022-01-01
 - 哪个更快:if (bool) 或 if(int)? 2022-01-01
 - 如何提取 __VA_ARGS__? 2022-01-01
 - GDB 不显示函数名 2022-01-01
 - OpenGL 对象的 RAII 包装器 2021-01-01
 - 将 hdc 内容复制到位图 2022-09-04
 - DoEvents 等效于 C++? 2021-01-01
 
						
						
						
						
						