模板化单例类 - 如何处理私有构造函数

时间:2012-07-13 08:59:47

标签: c++ templates constructor singleton private

我意识到已经讨论了多少次,但我没有为我的问题找到合适的解决方案。我刚刚在我的项目中实现了一个Meyer的单例类,但我想用它制作一个模板,以便我可以使用它作为例如

class Game : public Singleton<Game> { /* stuff */ }

我的课程定义如下

template <typename T>
class Singleton
{
public:
    static T& Instance();

private:
    Singleton();
    //declare them to prevent copies
    Singleton(Singleton const&);
    void operator=(Singleton const&);

};// END OF CLASS DEFINITION


// METHODS' DEFINITIONS

template<typename T>
T& Singleton<T>::Instance()
{
    static T _instance;
    return _instance;
}

允许ctor为public会破坏单身人士的整体愿景。

修改 好的,我已将Game课程更新为Singleton<Game>

class Game : public Singleton<Game>
{
friend class Singleton<Game>;
//...
}

但现在我有类似的东西:

  

未定义引用'Singleton&lt;游戏&gt; :: Singleton()'

函数Game::Game()中的

是空的

2 个答案:

答案 0 :(得分:2)

ctor Singleton() - &gt;保护?

答案 1 :(得分:2)

  

允许ctor公开会破坏Singletons的整体愿景。

不,不是真的。 Game应该有一个私有构造函数。 Singleton的构造函数无关紧要。 Singleton<Game>的一个实例无法帮助任何人获取Game的另一个实例,这是您感兴趣的内容。

无论如何,您可以声明构造函数protected。或者,您可以保留构造函数private并与模板参数保持联系。除了这在C ++ 03中不起作用。应该在C ++ 11中工作。但是有一个小技巧:

template <typename T>
struct wrapper
{
    typedef T type;
};

template <typename T>
class Singleton
{
    friend class wrapper<T>::type;

更新:Game应与Singleton<Game>或至少Singleton<Game>::Instance成为朋友,以允许调用其构造函数。