写单例模式引发的问题(静态变量,全局变量的应用)
2015-03-23 15:11
190 查看
之前也总写单例,不过基本上是网上直接拽,这次也是网上直接拽,却出了问题。。
这是头文件,然后我再.cpp里面include了头文件,其他地方引用头文件并初始化,就报错了:
看上去好像是重定义了之类的问题,后来百度找到原因引用一段话:
静态成员变量实际上是全局变量, 所以需要像全局变量一样定义以分配存储空间。
举个例子, 比如有一个类A声明在了A.h头文件中, 这个类A有一个静态变量 a。
这时有两个CPP文件包含了这个头文件,但这两个CPP文件编译后的输出中都不包含这个静态变量的实际定义而仅仅是标记这个变量符号为外部符号:因为这两
个CPP文件无法协调到底谁来实际生成这个变量的定义并分配空间,所以只好谁也不管这事, 你需要手动指定到底在哪个CPP里包含这个变更的实际分配。
意思就是全局变量是不能包含在两个文件中的,类似于类外写一个int i = 0;然后有两个文件包含这个头文件,就会报错(如果只有一个包含不报错)
但是想想又不对,我写的是静态变量啊,静态变量不就应该类外初始化么,最后没办法把静态变量初始化UserData* UserData::my_pInstance = NULL;挪到了cpp里面,就奇迹的通过了。
= =这个问题感觉还是很奇怪,就先这么记录一下,后面想明白了再回来改。。
至于全局变量int i = 0,写在类外的做法是加命名空间或者extern,有待实践。
class UserData { private: UserData(){} static UserData *my_pInstance; public: static UserData* myInstance() { if (my_pInstance == NULL) { my_pInstance = new UserData(); } return my_pInstance; } }; UserData* UserData::my_pInstance = NULL;
这是头文件,然后我再.cpp里面include了头文件,其他地方引用头文件并初始化,就报错了:
duplicate symbol _a in: /Users/zzz/Library/Developer/Xcode/DerivedData/CocosProject1-evrazoxxksceilbxnvvkcbfiidej/Build/Intermediates/CocosProject1.build/Debug/CocosProject1 Mac.build/Objects-normal/x86_64/UserData.o /Users/zzz/Library/Developer/Xcode/DerivedData/CocosProject1-evrazoxxksceilbxnvvkcbfiidej/Build/Intermediates/CocosProject1.build/Debug/CocosProject1 Mac.build/Objects-normal/x86_64/HelloWorldScene.o duplicate symbol __ZN8UserData12my_pInstanceE in: /Users/zzz/Library/Developer/Xcode/DerivedData/CocosProject1-evrazoxxksceilbxnvvkcbfiidej/Build/Intermediates/CocosProject1.build/Debug/CocosProject1 Mac.build/Objects-normal/x86_64/UserData.o /Users/zzz/Library/Developer/Xcode/DerivedData/CocosProject1-evrazoxxksceilbxnvvkcbfiidej/Build/Intermediates/CocosProject1.build/Debug/CocosProject1 Mac.build/Objects-normal/x86_64/HelloWorldScene.o ld: 2 duplicate symbols for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
看上去好像是重定义了之类的问题,后来百度找到原因引用一段话:
静态成员变量实际上是全局变量, 所以需要像全局变量一样定义以分配存储空间。
举个例子, 比如有一个类A声明在了A.h头文件中, 这个类A有一个静态变量 a。
这时有两个CPP文件包含了这个头文件,但这两个CPP文件编译后的输出中都不包含这个静态变量的实际定义而仅仅是标记这个变量符号为外部符号:因为这两
个CPP文件无法协调到底谁来实际生成这个变量的定义并分配空间,所以只好谁也不管这事, 你需要手动指定到底在哪个CPP里包含这个变更的实际分配。
意思就是全局变量是不能包含在两个文件中的,类似于类外写一个int i = 0;然后有两个文件包含这个头文件,就会报错(如果只有一个包含不报错)
但是想想又不对,我写的是静态变量啊,静态变量不就应该类外初始化么,最后没办法把静态变量初始化UserData* UserData::my_pInstance = NULL;挪到了cpp里面,就奇迹的通过了。
= =这个问题感觉还是很奇怪,就先这么记录一下,后面想明白了再回来改。。
至于全局变量int i = 0,写在类外的做法是加命名空间或者extern,有待实践。
相关文章推荐
- 全局变量和静态变量的初始化问题
- 全局变量的定义、声明、应用问题综合
- 在Java中关于静态变量和全局变量什么时候初始化的问题
- .net 全局变量 静态变量使用问题
- 关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题
- 关于全局变量及静态变量和initializer element is not constant问题
- 单例模式应用场景和设计失误所引发的问题
- 单例模式下全局变量出现的问题
- 遇到的问题一:单例模式及由此引发的静态方法与静态变量的问题
- C++全局变量初始化引发的问题
- 谈谈全局变量、静态变量的初始化问题
- 转载:关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题
- jquery.Ajax回调成功后数据赋值给全局变量的问题
- c++语言 全局变量 可声明问题
- Android通过Application存储应用全局变量
- C++(二)全局变量、局部变量及静态变量(static)的区别
- linux动态链接库全局变量共享问题&DLL共享数据段
- VS中常见bug问题解决方法——iostream.h&全工程的全局变量&光标阴影
- 局部变量、全局变量和静态变量的含义
- 全局变量的赋值以及类的默认构造函数问题