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

how to use class static variable across files

本文关键字:静态 变量 何跨 文件      更新时间:2023-10-16

如果我有一个类似的类:

//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();
};

and in ball.cpp:

int Ball::f()
{
    return 1;
}

这导致了i的多重定义。

我试着把extern在line1,line2和定义它在第3行,仍然有同样的错误,我也搜索了网络,大多数结果我发现谈论一个变量单独声明(不是在一个类),而我有一个静态类变量。

我知道extern与静态相反,但在line1中制作i extern并没有帮助,我也在SO中看到了许多问题,这是关于我不想要的名称空间的讨论,这并不能解决我的问题。

需要注意的是,没有body.cpp,除了Ball之外还有继承body的类,并且main.cpp将访问所有子类。

如何在Body .h之外使用Body::i呢?

p

创建另一个翻译单元Body.cpp并将定义移动到那里

int Body::i=2;

即使使用标题保护符(正如您提到的),定义也会出现在多个翻译单元中,因此会出现多重定义错误。

在您的特殊情况下,static类成员是一个原语,可以在声明点初始化:

class Body {
   static int i = 2;
};

你不应该header中定义静态成员。您需要为它创建一个 (.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