【发布时间】:2012-12-06 19:52:20
【问题描述】:
是否可以制作通用单例?我想创建一些我可以继承的东西并获得单例的功能。我在使用带有静态成员的模板时遇到了问题。
这不应该工作吗?
**
更新
**
感谢到目前为止的回复。所以现在我的问题是 GameEngine 看不到它自己的构造函数。我知道它是私人的,但仍然如此。
Singleton.h
template <typename T>
class Singleton
{
private:
static std::shared_ptr<T> m_Instance;
public:
static std::shared_ptr<T> Instance();
};
template<typename T>
std::shared_ptr<T> Singleton<T>::m_Instance = nullptr;
template<typename T>
std::shared_ptr<T> Singleton<T>::Instance()
{
if(m_Instance == nullptr)
m_Instance = std::make_shared<T>();
return m_Instance;
}
GameEngine.h
class GameEngine : public Singleton<GameEngine>
{
private:
GameEngine();
};
【问题讨论】:
-
(1) 为什么你认为你需要一个单例? (2) 如果你使用单例,为什么要使用
shader_pointer?这不像单例会被破坏,所以你可以剪掉那部分并只使用参考...... -
为什么要将模板代码放在 *.cpp 中?
-
每当您发布有关编译器错误的问题时,请包括 complete 和 unedited 错误列表。另外,请指出错误在代码中的哪里,因为它可能很难甚至不可能计算行数。
-
你需要一个单例吗?单例提供了三个完全独立的东西,但它试图将它们作为一个包提供。如果您不应该被允许复制您的课程,请使其不可复制。如果多次实例化你的类应该是一个错误,检测那个错误并抛出一个异常(如果你可以构造不止一次,为什么要阻止它?)。如果您需要一个全球可用的实例,请创建一个。这些都不意味着其他两个。
-
@GManNickG:将单例创建为全局变量的问题在于,如果一个人使用来自不同翻译单元的另一个翻译单元,那么它们的创建顺序是未定义的,因此这会导致未定义的行为。如果您使用我的答案中显示的局部静态变量模式,那么单例将以正确的顺序延迟初始化。