2012-07-13 115 views
3

我意识到这已被讨论了多少次,但我还没有找到适合我的问题的解决方案。我刚刚在我的项目中实现了一个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; 
} 

允许男星我的课是public会破坏单身的整个视野​​。

编辑 好了,我已经更新了我的Game类交好Singleton<Game>

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

但现在我有这样的事情:

未定义参考“辛格尔顿<游戏> :: Singleton()'

在功能Game::Game()这是空的

+0

你的问题到底是什么?由于Singleton-ctor是私人的,该游戏无法调用Singleton 的ctor? - >保护Singleton的ctor。还是说Game的玩家必须是公开的,以便Singleton :: instance可以构造游戏对象? – MadScientist 2012-07-13 09:18:36

回答

2

允许ctor公开将破坏单身人士的整体视野。

不,不是真的。 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,允许被称为它的构造。

+0

请看看我的更新。我已经尝试了两个朋友'Singleton '并使用受保护的构造函数,但现在我有一个编译错误。 – Patryk 2012-07-13 09:39:06

+1

这是一个链接器错误。您需要定义构造函数,而不仅仅是声明它。最简单的方法是在类的内部将空体'{}'添加到构造函数声明中。 – 2012-07-13 11:58:43

2

ctor Singleton() - > protected?

相关问题