问题简述
近来 C++ 用到单例模式,(单例模式是啥不说了,网上大把的资料),结果编译的时候遇到 undefined reference to `XXX' XXX 是单例模式中的那个静态私有指针。结果是由于变量没有初始化引起。虽然解决之后听起来很小白,但着实用了很多时间,所以决定做个记录。
来龙去脉
写了个单例模式,大概这样
//Single.h
class Single(){
public:
static Single * GetInstance();
private:
static Single * instance;
Single(){};
}
//Single.cc
Single*
Single::GetInstance(){
if(instance == NULL){
instance = new Single();
}
return instance;
}
其他部分略去不表,结果编译时报错
undefined reference to `instance'
百思不得其解啊,怎么能找不到呢,很清楚的声明了啊
声明 != 定义
声明:是的名字为程序所知
定义:负责创建与名字关联的实体(摘自 C++ primer)
按照字面意思理解似乎声明完了就不应该报 undefine reference 错才对,但考虑到程序在定义是才给变量分配内存,所以理解为指向类实例的指针只有定义过了才能使用
解决方法
这就很简单了,在 Single.cc 中加上
Single* Single::instance = NULL;
也就是定义 instance 变量就行。不要怀疑,private 类型的 static 变量也可以这么定义。 static 变量其实不属于任何类。