如何在C++中实现Singleton

Alc*_*ott 0 c++ inheritance singleton

这篇文章就是我刚才读到的.

他在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() {}
};
Run Code Online (Sandbox Code Playgroud)

  1. 我认为我们应该将这个static T& getInstance()定义放在课堂体外,对吧?

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

Ker*_* SB 5

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

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

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