c++单例模式出错

Martian158 2013-09-01 04:54:00
代码如下,竟然出现编译错误:error LNK2001: 无法解析的外部符号 "private: static class Singleton * Singleton::instance" (?instance@Singleton@@0PAV1@A)
class Singleton
{
public:
static Singleton *GetSingleton()
{
if(instance==NULL) instance=new Singleton();
return instance;
}
~Singleton()
{
cout<<"析构函数"<<endl;
}
private:
Singleton(){};
static Singleton*instance;
};
int main()
{
Singleton*p=Singleton::GetSingleton();
return 0;
}
...全文
250 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzben 2013-10-25
  • 打赏
  • 举报
回复
引用 2 楼 xzben 的回复:
你的静态成员没有初始化。 class Singleton { public: static Singleton *GetSingleton() { static Singleton instance; return &instance; } ~Singleton() { cout<<"析构函数"<<endl; } private: Singleton(){}; }; 个人觉得这个写法好点,这样你的单例对象不需要自己考虑释放内存了,不然你这里的单例对象还要最好找机会释放内存。
嗯,是的!
todd_leftcode 2013-09-01
  • 打赏
  • 举报
回复
静态成员变量实际上是全局变量, 所以需要像全局变量一样定义以分配存储空间。 举个例子, 比如有一个类A声明在了A.h头文件中, 这个类A有一个静态变量 a。 这时有两个CPP文件包含了这个头文件,但这两个CPP文件编译后的输出中都不包含这个静态变量的实际定义而仅仅是标记这个变量符号为外部符号:因为这两个CPP文件无法协调到底谁来实际生成这个变量的定义并分配空间,所以只好谁也不管这事, 你需要手动指定到底在哪个CPP里包含这个变更的实际分配。 也就是那一行 Singleton* Singleton::instance; 相对来讲2楼的方案更好,也是C++中单例模式的常规实现方法。 优点是自动析构且相对线程安全。另建议如果可能返回引用类型而不是指针,暗示该实例不可手动删除。
「已注销」 2013-09-01
  • 打赏
  • 举报
回复
话说static类型的函数不是应该在函数体外定义的吗
Martian158 2013-09-01
  • 打赏
  • 举报
回复
确实是因为静态成员没有初始化的问题,但为什么必须初始化呢? 之前的方法需要在调用GetSingleton()之后,再调用delete才能执行析构函数。xzben童鞋的方法不错,在主函数结束后,自动会释放临时变量,这时候会调用析构函数,对吧?@xzben
xzben 2013-09-01
  • 打赏
  • 举报
回复
你的静态成员没有初始化。 class Singleton { public: static Singleton *GetSingleton() { static Singleton instance; return &instance; } ~Singleton() { cout<<"析构函数"<<endl; } private: Singleton(){}; }; 个人觉得这个写法好点,这样你的单例对象不需要自己考虑释放内存了,不然你这里的单例对象还要最好找机会释放内存。
baihacker 2013-09-01
  • 打赏
  • 举报
回复
Singleton* Singleton::instance; 少了这样一句。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧