4

我正在玩一个渴望初始化的通用单例类。这个想法是你像这样从类中公开继承:

class foo : public singleton<foo> { };

我在这个过程中学到了很多东西,但我现在被困住了,因为它破坏了我的 Visual Studio 2008 链接器。问题在于静态实例成员和/或其初始化。

template<class T>
class singleton {
    singleton();
    singleton(singleton const &);
    singleton & operator = (singleton const &);
public:
    static T & instance;
};
template<class T> T & T::instance;

任何见解将不胜感激!

编辑:

有了这个类声明......

template<class T>
class singleton {
    singleton();
    singleton(singleton const &);
    singleton & operator = (singleton const &);
public:
    static T instance;
};
template <class T> T singleton<T>::instance;

当我尝试这样做时...

class foo : public singleton<foo> { };

我得到这个错误...

错误 C2248:“singleton::singleton”:无法访问在“singleton”类中声明的私有成员

...

此诊断发生在编译器生成的函数“foo::foo(void)”中

我的解释是单例想要构造一个 foo 对象,它通过继承依赖于构造函数是私有的单例的构造。我认为单例可以访问它自己的构造函数,但我猜不是。有任何想法吗?

编辑2:

我已经意识到继承自singleton<T>的方法存在需要更改类以用作单例的问题。我已经为我急切初始化的单例类模板提供了以下代码。

template<typename T>
class singleton_wrapper {
    singleton_wrapper();
    singleton_wrapper(singleton_wrapper const &);
    singleton_wrapper & operator = (singleton_wrapper const &);
    static T instance;
    template<typename T> friend T & singleton();
};
template<typename T> T singleton_wrapper<T>::instance;

template<typename T>
T & singleton() {
    return singleton_wrapper<T>::instance;
}

上课...

class foo {
public:
    void bar() { }
};

...可以使用以下命令访问它的单个实例(在 main() 之前初始化):

singleton<foo>().bar();

再次感谢您的帮助,尤其是 GMan。我对堆栈溢出的第一次体验感到非常满意。

4

2 回答 2

7

你不能,因为你没有具体的例子。您可能需要创建一个可以参考的实际实例:

template <class T>
class singleton {
    ...
private:
    static T instance_;
public:
    static T& instance;
};
template <class T> T singleton<T>::instance_;
template <class T> T& singleton<T>::instance = singleton<T>::instance;

或者,更简单地说,完全放弃引用:

template <class T>
class singleton {
    ...
public:
    static T instance;
};
template <class T> T singleton<T>::instance;
于 2010-01-18T20:44:06.320 回答
1

即开即用:将实例更改为“T”类型而不是“T &”类型。

于 2010-01-18T20:43:08.440 回答