1

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

这不应该工作吗?

**

更新

**

感谢您到目前为止的答复。所以现在我的问题是 GameEngine 看不到它自己的构造函数。我知道这是私人的,但仍然。

单例.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;
}

游戏引擎.h

class GameEngine : public Singleton<GameEngine>
{
private:
GameEngine();

};
4

2 回答 2

6

我不明白它是如何工作的,因为没有什么能阻止你创建更多的GameEngine.

即使有可能(并且确实)有一种创建单例的通用方法(可能涉及宏),我还是建议不要这样做,因为您真正想要单例的情况很少见。让我换个说法……真正需要单身人士的情况很少见。

于 2012-12-06T19:55:02.960 回答
1

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

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

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

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

于 2012-12-06T20:23:37.330 回答