单例模式中静态类成员变量初始化问题

    最近做一个项目,C++语言,使用到了单例模式做设计。在具体编写代码时,使用了静态成员变量和静态函数。代码如下:

class Camera
{
	private:
		//(省略若干代码)
		static Camera* pCamera ;
		//(省略若干代码)
	public:
	  //(省略若干代码)
		static Camera* getInstance()
		{
			if(pCamera==NULL)
				pCamera=new Camera();
			return	pCamera;
		}
	  //(省略若干代码)		
}

在编译时,提示:

Client.o: In function `Camera::getInstance()':
/mnt/hgfs/mpp/sample/faceRecogn/Camera.h:77: undefined reference to `Camera::pCamera'
collect2: ld returned 1 exit status

    由于对C++类静态成员变量初始化规则记忆模糊,然后这个代码形式在网上也到处搜索的到,故一直在思考是不是由其它地方的语法错误引起的。后来,翻阅相关权威技术文档,最终明白了语法规则。以下内容摘自《C++ primer (第四版)》。

    static 数据成员必须在类定义体的外部定义(正好一次)。不像普通数据成员,static 成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。 保证对象正好定义一次的最好办法,就是将 static 数据成员的定义放在包含类非内联成员函数定义的文件中。 

    也就是说在定义静态成员变量时,必须对其进行初始化,不管是内置类型还是类类型。如果没有进行初始化,则在引用时,会提示未定义的引用错误。而如果只是定义,并不在任何地方引用,则不会出现编译错误,但是变量不可用。

    注:本例中使用到的单例模式代码并非最优,仅作代码参考,如果对单例模式有兴趣的可以自行找其他资料学习。

你可能感兴趣的:(C/C++)