Singleton模板为C 的基类
singleton template as base class in C++
根据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;
}
然后我的问题是
- 我的单例模板正确吗?
- 如果单例模板正确,则两个记录器都是正确的?
- 第一个和第二个更好的区别,哪个更好?
更新
答案后,我了解到第一个允许有几个记录仪,并且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;}
};
- 我的单例模板正确吗?
是的。
- 如果单例模板正确,则两个记录器都是正确的?
您的第一个片段允许使用复制构造函数的几个记录器。因此,在这方面,这是不正确的。
- 第一个和第二个更好的区别,哪个更好?
如果您修复了第一个摘要也可以禁止复制构造函数,那么您只错过了基本的getInstance
,而您的Singleton
类似乎不需要。
使用第二个片段,您甚至可以省略击曲线。
1)您的单例模板是正确的。
2)您的两个记录器都是正确的。但是第二个是不好的做法。因为没有必要从单例模板派生的记录器。您可以通过将此行放入第二个线上进行检查:
Singleton<Logger>::getInstance().print();
工作正常。
3)第一个更好。
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 为什么此派生对象无法访问基类的后递减方法?
- 公开最直接的基类模板名称
- 当基类是依赖类型时,这是一个缺陷吗
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 模板基类中的静态变量
- 具有多个非默认构造函数基的Singleton派生类
- Singleton模板为C 的基类