如何跨文件使用类静态变量

时间:2015-05-30 11:42:10

标签: c++

如果我有类似这样的课程:

//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?

PS

所有课程都被头部保护包围。

2 个答案:

答案 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