我正在玩一个急于初始化的通用单例类。这个想法是你从类中公开继承,如下所示:
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;
任何见解将不胜感激!
EDIT:
通过这个类声明...
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”类中声明
...
此诊断发生在编译器生成的函数“foo::foo(void)”中
我的解释是,单例想要构造一个 foo 对象,通过继承,该对象依赖于构造函数为私有的单例的构造。我认为单例可以访问它自己的构造函数,但我想不能。有任何想法吗?
EDIT 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。我对第一次使用 Stack 的经历感到非常满意overflow.