在iOS开发中,我们可以自定义一个单例类,用于在整个应用程序中来使用,比较常见的就是[UIApplication sharedApplication],它是整个应用程序抽象出来的单例类,用它可以设置statusBar、获取一些系统的属性,当然还有很多的功能等着你去发现;再比如就是[UIDevice currentDevice]是抽象出当前硬件设备的单例类,你可以通过这个单例来了解当前设备是iPad还是iPhone,屏幕的方向现在是横屏还是竖屏,等等。
在c++中,怎样实现一个单例呢?使用extern关键字可以达到这个效果。首先要说明的是extern关键字的作用,我们可以像下面的代码一样使用它来声明变量,
extern int a;
这样就表明声明了整型变量a,但是系统没有给变量a分配内存空间。
好了,现在正是介绍怎样在c++中使用全局变量或者说是单例,已知有两个c++源文件,分别是A.h和B.h,两个文件中的内容如下代码,
//A.cpp file
int x = 5;
class A
{
public:
//...
private:
//...
};
//B.h file
extern int x;
class B
{
public:
void printX();
void resetX(int newX);
};
//B.cpp file
void B::printX(){
print("value of x is %d",x);
}
void B::resetX(int newX)
{
x = newX;
}
上面的代码很简单,首先我们来看B.h文件,它在使用extern关键字声明了整形变量x,它告诉编译器,我这里只是声明了变量x,但是没有给它赋值,你要到其他的相关文件中找到x变量的定义。这样编译器就会在其他的文件中寻找,最终它在A.h文件中找到了定义在开头的int x = 5;语句,该语句就是定义了x变量,这正是B.h和B.cpp文件所需要的,然后它就可以拿来在它的printX()和resetX(int newX)方法中使用了。
那么有人会问,如果我在另外一个C.h文件的开头再使用int x = 10;定义x变量,这时候有两个x,对于B.h和B.cpp来说它不就是晕了吗?如下代码,
//C.h
int x = 10;
class C
{
};
这种情况我也试了一下,这时候编译器就会报错,大概意思就是程序员在程序中重复定义了x变量,这时候编译都不会通过的。
在B.h文件中使用extern声明了x整型变量,这时候如果项目中其他的文件导入B.h文件,那么就可以使用全局定义的变量x,所以你想要在其他文件中使用全局变量,就要导入B.h头文件,使用下面的预处理指令#include,
#include "B.h"
总结:这里只是使用了基本的类型int来声明和定义变量,我们也可以使用自定义的类来声明和定义变量,在全局使用,例如在定义的Person类,这里不再赘述,原理都是一样的。