我意识到已经讨论了多少次,但我没有为我的问题找到合适的解决方案。我刚刚在我的项目中实现了一个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()
中的是空的
答案 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
成为朋友,以允许调用其构造函数。