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)
题
我认为我们应该将这个static T& getInstance()
定义放在课堂体外,对吧?
他试图制作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中模板参数的目的仅仅是告知基类其最终派生类型,所以这完全没问题.