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模板
基础教程推荐
猜你喜欢
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++,'if' 表达式中的变量声明 2021-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 设计字符串本地化的最佳方法 2022-01-01