BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #79254同步于 2014/5/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于类定义和类实现分离后static成员的初始化问题

xxxyyy1133
2014/5/9镜像同步9 回复
"a.h" #pragma once class A { public: static int b; static int get(){ return a; } private: static int a; }; int A::b = 1; int A::a = 2; "a.cpp" #include "a.h" "1.cpp" #include <iostream> #include "a.h" using namespace std; void main() { cout << A::b; system("pause"); } 分别编译a.cpp 和main.cpp没错 但连接时报错 貌似是重定义? 如果去掉a.cpp,就能编译成功 不知错误的原因?求大神指点![ema11]
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
GentlyGuitar机器人#1 · 2014/5/9
你用的啥编译器。。。
xxxyyy1133机器人#2 · 2014/5/9
【 在 GentlyGuitar 的大作中提到: 】 : 你用的啥编译器。。。 用VS2013 和 g++ 都试了 都报的这个问题。。 只是用G++报的错。。
GentlyGuitar机器人#3 · 2014/5/9
我刚用g++试了,没有报错。。有输出
xxxyyy1133机器人#4 · 2014/5/9
【 在 GentlyGuitar 的大作中提到: 】 : 我刚用g++试了,没有报错。。有输出 是这个不?
GentlyGuitar机器人#5 · 2014/5/9
【 在 xxxyyy1133 的大作中提到: 】 : [upload=1][/upload] : 是这个不? 哦,忘了一起编译了,静态变量的作用域是仅在本cpp文件,把他include到两个源文件中以后不就相当于定义了两次吗。。如果是非静态全局变量就没错了,一次定义,各个源文件中都有效。。。个人理解,可以探讨
tangzehang机器人#6 · 2014/5/9
在头文件加入一个宏定义吧。然后#include之前判断宏是否定义了。
tonyjansan机器人#7 · 2014/5/9
静态变量的定义/初始化请放在任一.cpp文件中: // a.cpp #include "a.h" int A::b = 1; int A::a = 2; --------------------------------------------- To LS: #pragma once近似等效于: #ifndef __A_H__ #define __A_H__ // ... #endif // __A_H__ 【 在 xxxyyy1133 的大作中提到: 】 : "a.h" : [code=c] : #pragma once : ...................
rollse机器人#8 · 2014/5/9
每一个.cpp文件编译后都会生成一个.o文件,楼主将类的静态成员变量定义放在头文件里面,然后多个.cpp源文件include了这个头文件,那么最后编译生成的.o文件里面都有这些定义,链接的时候造成多重定义。 把他们的定义放到任何一个.cpp源文件里面就可以了,保证编译后只有一个.o文件里面有他们的定义。
hailangge机器人#9 · 2014/5/12
这个俺记得,static成员必须放到一个包含该头文件的cpp里初始化