静态单身?

时间:2012-12-06 19:52:21

标签: c++ templates static

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

不应该这样吗?

**

已更新

**

感谢目前为止的回复。所以现在我的问题是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();

};

2 个答案:

答案 0 :(得分:6)

我看不出它是如何工作的,因为没有什么可以阻止你创建GameEngine的更多实例。

即使有可能(而且是)有一种创建单例(也许涉及宏)的通用方法,我会反对它,因为你真正想要单身的情况很少 。让我重新说一下......实际上真正需要单身人士的情况很少见。

答案 1 :(得分:1)

创建单例的最佳方法如下:

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

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

在第一次调用实例时,e变量将被(线程安全地)初始化,并且它将在有序进程退出时被销毁。私有/已删除的构造函数阻止创建第二个实例。