我正在玩一个渴望初始化的通用单例类。这个想法是你从类中公开继承:
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' :无法访问私人会员 在“单身人士”课程中宣布
...
此诊断发生在编译器生成的函数'foo :: foo(void)'
中
我的解释是,singleton想要构造一个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。我对堆栈溢出的第一次体验感到非常满意。
答案 0 :(得分: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;
答案 1 :(得分:1)
袖手旁观:将实例更改为“T”类型而非“T&amp;”。