c++单例模式出错
本帖最后由 Martian158 于 2013-09-01 16:55:15 编辑 代码如下,竟然出现编译错误: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;
} C++ 设计模式 单例模式
[解决办法]
Singleton* Singleton::instance;
少了这样一句。
[解决办法]
你的静态成员没有初始化。
class Singleton
{
public:
static Singleton *GetSingleton()
{
static Singleton instance;
return &instance;
}
~Singleton()
{
cout<<"析构函数"<<endl;
}
private:
Singleton(){};
};
个人觉得这个写法好点,这样你的单例对象不需要自己考虑释放内存了,不然你这里的单例对象还要最好找机会释放内存。
[解决办法]
静态成员变量实际上是全局变量, 所以需要像全局变量一样定义以分配存储空间。
举个例子, 比如有一个类A声明在了A.h头文件中, 这个类A有一个静态变量 a。
这时有两个CPP文件包含了这个头文件,但这两个CPP文件编译后的输出中都不包含这个静态变量的实际定义而仅仅是标记这个变量符号为外部符号:因为这两个CPP文件无法协调到底谁来实际生成这个变量的定义并分配空间,所以只好谁也不管这事, 你需要手动指定到底在哪个CPP里包含这个变更的实际分配。 也就是那一行 Singleton* Singleton::instance;
相对来讲2楼的方案更好,也是C++中单例模式的常规实现方法。 优点是自动析构且相对线程安全。另建议如果可能返回引用类型而不是指针,暗示该实例不可手动删除。