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() {}
};
问题
我认为我们应该把
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 中模板参数的目的仅仅是通知基类其最终的派生类型,所以这完全没问题。
关于c++ - 如何在C++中实现单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8208533/