【问题标题】:how to use class static variable across files如何跨文件使用类静态变量
【发布时间】:2015-05-30 11:42:09
【问题描述】:

如果我有类似的课程:

//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 与 static 相反,但在 line1 中制作 i extern 并没有帮助,而且我在 SO 中看到了很多问题,this 谈到了我不想要的命名空间,this 没有t 解决我的问题。

请注意,没有 body.cpp,除了 Ball 之外还有其他类继承了 body,还有 main.cpp 可以访问所有子类。

那么如何才能在 body.h 之外使用 Body::i 呢?

PS

所有类都被标题保护包围。

【问题讨论】:

  • 包含守卫和重新定义错误的混淆必须是最不可能根除的误解之一。谢谢,奥巴马。

标签: c++


【解决方案1】:

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

int Body::i=2;

即使有标题保护,正如您提到的那样,定义出现在多个翻译单元中,因此出现多个定义错误。

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

class Body {
   static int i = 2;
};

【讨论】:

    【解决方案2】:

    您不应该在标题定义静态成员。您需要为它制作一个source (.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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      相关资源
      最近更新 更多