0

我有两个班,FooBar

Foo.h

class Foo
{
public:
    static void Setm(int i) { m = i; }
private:
    static int m;
};

酒吧.h

class Foo;
class Bar
{
 public:
     Bar(int m) {Foo::Setm(m);}
};

主文件

#include "Foo.h"
#include "Bar.h"
void main() {
   Bar bar(5);
}

编译时出现以下错误: 1>Foo.obj : error LNK2001: unresolved external symbol "private: static int Foo::m" (?m@Foo@@0HA) 1>Bar.obj : error LNK2001: unresolved external符号“私有:静态 int Foo::m”(?m@Fool@@0HA)

4

4 回答 4

2

任何非整数/枚举类型的静态类成员变量必须在其声明/定义之外进行初始化。

一个这样的地方可以是 main 的全局范围。

即在main.cpp中:

 int Foo::m = 0;
于 2013-03-13T16:40:38.463 回答
0

int FOO::m = 0;

在实现文件中的类定义之外。

于 2013-03-13T16:40:33.403 回答
0

你必须初始化静态变量:

class Foo
{
public:
    static int m;
static void Setm(int i) { m = i; }
private:
};
int Foo::m=2;

class Foo;
class Bar
{
 public:
 Bar(int m) {Foo::Setm(m);}
};


int main(int argc, char** argv) {
    Foo::Setm(5);
    Bar b(5);
    return 0;
}
于 2013-03-13T16:56:21.367 回答
0

几件事。

  • 您应该包括标头守卫:

例子:

//Foo.H
#ifndef __FOO_H__
#define __FOO_H__
...
...
#endif

尽管其他答案说明了什么,但 main 是一个可怕的地方。这样做需要每个使用过这个类的人都知道在他们的主要工作中这样做。当我想使用您的标头(甚至您团队中的另一个开发人员或另一个代码块)时,我怎么知道在我的 main 中定义静态常量?答案是我不会。这是一种懒惰的做法,会形成一个坏习惯。甚至不要让我开始学习静态初始化/破坏的乐趣。

您不能将其放在 Foo.H 中,因为这样做会导致包含您的标头的每个编译单元重新定义时出现链接器错误。

一个更好的地方是在新创建的 Foo.[c|.cxx|.cpp|.cc] (无论你使用什么后缀)。主要工作吗?是的,它适用于你……现在。以后会不会出问题?大概。它是一种好的形式和一个值得记住的解决方案吗?绝对不。

最佳答案

//Foo.C (NOT MAIN)  
#include<Foo.h>  
int Foo::m = 0;  

您还应该注意的是,我的答案与在其构造函数中使用它的第二个类没有任何关系。如果我有要点,我会编辑您的问题的标题,因为它与构造函数或类成员函数无关。您在谈论静态类方法/函数而不是成员函数/方法。

于 2013-03-13T17:44:02.087 回答