如果我有类似这样的课程:
//body.h
class Body
{
static int i;//line 1
};
int Body::i=2;/line 2
和这样的课程:
//ball.h
#include <body.h>
//line 3
class Ball:public Body
{
int f();
};
并在ball.cpp中:
int Ball::f()
{
return 1;
}
这会导致i
的多重定义。
我尝试将extern
放在第1行,第2行并在第3行中定义并且仍然有相同的错误,我也搜索了网页,我发现的大多数结果都是关于仅仅声明的变量(不是在我有一个静态类变量。
我知道extern与静态相反,但是在line1中使i
extern没有帮助,我在SO中看到了很多问题,this讨论了我不想要的命名空间,{ {3}}没有解决我的问题。
作为一个注释,没有body.cpp,除了Ball之外还有继承body的类,还有main.cpp可以访问所有子类。
那么如何在body.h之外使用Body :: i?
所有课程都被头部保护包围。
答案 0 :(得分:5)
创建另一个翻译单元Body.cpp
并将定义移到那里
int Body::i=2;
即使使用标题保护,正如您所提到的那样,定义会出现在多个翻译单元中,因此会出现多重定义错误。
在您的特定情况下,static
类成员是基元,并且可以在声明点处初始化:
class Body {
static int i = 2;
};
答案 1 :(得分:2)
您不应定义 标题中的静态成员。您需要为其创建源(.cpp
)文件:
body.h (声明静态,但不要定义)
class Body
{
static int i; // only declare
};
// int Body::i=2; // do not define it here
body.cpp (在此处定义静态)
#include "body.h"
int Body::i = 2; // now we define it