2012-12-06 45 views
1

是否有可能做一个通用的单身人士?我想创建一些我可以继承并获得单例的功能。我在使用带有静态成员的模板时遇到了麻烦。静态单身?

不应该工作吗?

**

修订

**

感谢您的答复为止。所以现在我的问题是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

(1)你为什么认为你需要一个单身人士? (2)如果你使用单例,为什么使用'shader_pointer'?这不像是单身人士会被破坏,所以你可能会削减那部分,只是使用参考... – delnan

+0

为什么你把模板代码放在* .cpp中? – Grizzly

+0

每当您发布有关编译器错误的问题时,请包括_complete_和_unedited_错误列表。另外,请在代码中指出_where_错误,因为可能很难甚至不可能计算行数。 –

回答

1

创建一个单独的最好方法如下:

class GameEngine 
{ 
public: 
    static GameEngine& instance() { static GameEngine e; return e; } 

private: 
    GameEngine() {} 
    GameEngine(const GameEngine&) = delete; 
}; 

电子变量将是(线程安全)的第一次调用实例初始化,它将在有序的进程退出被破坏。私有/删除的构造函数阻止创建第二个实例。

+0

你能解释一下这个变量吗?或者有任何好的文档?我很困惑它是如何初始化的。 –

+0

它被称为_local静态变量_。变量的名称在本地限定为该块,但存储期限为全局。它将在第一次调用该函数时构造,但它仍然适用于程序生命的其余部分。 –

+0

显然这与删除构造函数和析构函数有什么区别? –

6

我看不出那会工作,因为没有什么阻止你创建的GameEngine多个实例。

即使有可能(它是)有一个通用的方式来创建一个单身人士(也许涉及宏),我会建议反对它,因为情况下,你实际上想单身人士是罕见的。让我换句话说......你真的需要真的需要一个单身人士是罕见的。

+0

我同意他们应该少,但问题是怎么不是为什么。 –

+0

对于大多数程序,我会同意。但是,你永远不会想要在同一个进程中运行两个游戏,所以你可能只是使用全局变量来处理一些事情,而不是传递一个指针。它让事情变得更简单,而且可能会更快一点。 – dupersuper

+0

@JoshElias:这个问题很可能是“如何”,但关于StackOverflow最好的事情之一是它为许多人提供帮助的原因之一,因为通常当有很多经验的人怀疑*错误的问题是被问*,他们会提出并询问*正确*问题。 –