读书人

单件类运行时异常有关问题。代码很短。

发布时间: 2012-04-16 16:20:04 作者: rapoo

单件类运行时错误问题。。代码很短。。路过好心人帮帮忙
单件类问题。。路过的大大帮帮忙啊~~~

写一个单件类,编译通过运行时提示:
1>------ 已启动生成: 项目: 单件类, 配置: Debug Win32 ------
1>正在链接...
1>main.obj : error LNK2001: 无法解析的外部符号 "protected: static class A * Singleton<class A>::ms_Singleton" (?ms_Singleton@?$Singleton@VA@@@@1PAVA@@A)
1>E:\程序\数据结构与STL复习\单件类\Debug\单件类.exe : fatal error LNK1120: 1 个无法解析的外部命令
1>生成日志保存在“file://e:\程序\数据结构与STL复习\单件类\单件类\Debug\BuildLog.htm”
1>单件类 - 2 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========


代码

C/C++ code
#include <assert.h>template <typename T> class Singleton{//private:    /** \brief Explicit private copy constructor. This is a forbidden operation.*/    Singleton(const Singleton<T> &);    /** \brief Private operator= . This is a forbidden operation. */    Singleton& operator=(const Singleton<T> &);protected:    static T* ms_Singleton;public:    Singleton( void )    {        assert( !ms_Singleton );        ms_Singleton = static_cast< T* >( this );    }    ~Singleton( void )    {  assert( ms_Singleton );  ms_Singleton = 0;  }    static T& getSingleton( void )    {    assert( ms_Singleton );  return ( *ms_Singleton ); }    static T* getSingletonPtr( void )    { return ms_Singleton; }};class A:public Singleton<A>{};int main(){    A* a1=new A();    A* a2=new A();    return 1;}


[解决办法]
亲,你这个是个链接错误,原因是没有初始化静态成员变量。

C/C++ code
#include <cassert>template<typename T>class Singleton {//private:    /** \brief Explicit private copy constructor. This is a forbidden operation.*/    Singleton(const Singleton<T> &);    /** \brief Private operator= . This is a forbidden operation. */    Singleton& operator=(const Singleton<T> &);protected:    static T* ms_Singleton;public:    Singleton(void) {        assert( !ms_Singleton);        ms_Singleton = static_cast<T*>(this);    }    ~Singleton(void) {        assert( ms_Singleton);        ms_Singleton = 0;    }    static T& getSingleton(void) {        assert( ms_Singleton);        return (*ms_Singleton);    }    static T* getSingletonPtr(void) {        return ms_Singleton;    }};template<typename T>T* Singleton::ms_Singleton = NULL;class A: public Singleton<A> {};int main() {    A* a1 = new A();    A* a2 = new A();    return 1;} 

读书人网 >C++

热点推荐