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;
}

允许 ctor 存在public将破坏 Singleton 的整个愿景。

编辑 好的,所以我更新了我的Game班级以成为朋友Singleton<Game>

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

但现在我有类似的东西:

未定义对“Singleton<游戏>::Singleton()”的引用

Game::Game()在为空的函数中

4

2 回答 2

2

ctor Singleton() -> 受保护?

于 2012-07-13T09:08:44.923 回答
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,允许调用它的构造函数。

于 2012-07-13T09:24:05.623 回答