c++ - 如何在C++中实现单例

标签 c++ inheritance singleton

This post是我刚刚读到的。

他在 C++ 中实现 Singleton 的方式让我很困惑。我有几个关于它的问题,这是他的代码:

template<typename T>
class Singleton {
public:
    static T& getInstance() {  //Question 1
        return instance;
    }
private:
    static T instance;
};

class DebugLog : public Singleton<DebugLog> {  //Question 2
public:
    void doNothing() {}
};

问题

  1. 我认为我们应该把 static T& getInstance()的定义在类主体之外,对吧?

  2. 他试图制作 class DebugLog一个单例类,但是当他继承Singleton<DebugLog> , DebugLog不存在,对吧?如果正确,那么模板类如何Singleton实例化一个不存在的类?

最佳答案

1) 不,您如何构建代码并不重要。 Singleton顺便说一下,它不是一个类:它是一个模板。由于完整的模板定义无论如何都必须在任何实例化站点上都是可访问的,因此您最好将所有内容都定义为内联。

2) class DebugLog : public Singleton<DebugLog>很好。我们不是从一个不存在的类继承;相反,我们继承自 Singleton<DebugLog> 类.模板可以在不完整的类型上实例化。 (对于这样的类型参数,您可以做什么和不能做什么有几条规则。)

例如,template <typename T> class Foo { };当然可以毫无问题地在任何类型上实例化。更有趣的是,template <typename T> struct PointerFactory { typedef T * type; };可以在任何类型上实例化,无论是否完整。在目前的情况下,CRTP 中模板参数的目的仅仅是通知基类其最终的派生类型,所以这完全没问题。

关于c++ - 如何在C++中实现单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8208533/

相关文章:

c++ - 如果未调用某些成员函数,是否可能生成编译时错误

C++ 递归可变参数 Lambda

c++ - parallel_for 中互斥体的多线程替代方案

c++ - 如何获得正在监听的端口列表及其各自的应用程序名称

java - java中未知的父变量问题

c++ - 获取指向基类的 protected 方法的指针并将其传递给不同的类

java - 使用 SharedPreferences 的最安全方式

c++ - 读/写一个步长远大于其宽度的矩阵会导致性能损失很大

c++ - static_cast 限制对公共(public)成员函数的访问?

java - 单例适合这种设计吗?