返回信息流"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]
这是一条镜像帖。来源:北邮人论坛 / cpp / #79254同步于 2014/5/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于类定义和类实现分离后static成员的初始化问题
xxxyyy1133
2014/5/9镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 GentlyGuitar 的大作中提到: 】
: 你用的啥编译器。。。
用VS2013 和 g++ 都试了 都报的这个问题。。
只是用G++报的错。。
【 在 xxxyyy1133 的大作中提到: 】
: [upload=1][/upload]
: 是这个不?
哦,忘了一起编译了,静态变量的作用域是仅在本cpp文件,把他include到两个源文件中以后不就相当于定义了两次吗。。如果是非静态全局变量就没错了,一次定义,各个源文件中都有效。。。个人理解,可以探讨
静态变量的定义/初始化请放在任一.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
: ...................
每一个.cpp文件编译后都会生成一个.o文件,楼主将类的静态成员变量定义放在头文件里面,然后多个.cpp源文件include了这个头文件,那么最后编译生成的.o文件里面都有这些定义,链接的时候造成多重定义。
把他们的定义放到任何一个.cpp源文件里面就可以了,保证编译后只有一个.o文件里面有他们的定义。