构造函数中未解析的静态符号,同时使用另一个类的静态成员函数。

时间:2013-03-13 16:38:24

标签: c++ class constructor static-members

我有两个课程,FooBar

foo.h中

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

Bar.h

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

的main.cpp

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

当我编译时,我得到这些错误: 1> Foo.obj:错误LNK2001:未解析的外部符号“private:static int Foo :: m”(?m @ Foo @@ 0HA) 1> Bar.obj:错误LNK2001:未解析的外部符号“private:static int Foo :: m”(?m @ Fool @@ 0HA)

4 个答案:

答案 0 :(得分:2)

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

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

即。在main.cpp中:

 int Foo::m = 0;

答案 1 :(得分:0)

int FOO::m = 0;

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

答案 2 :(得分: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;
}

答案 3 :(得分:0)

一些事情。

  • 你应该包括标题保护:

示例:

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

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

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

更好的地方是新创建的Foo。[c | .cxx | .cpp | .cc](无论你使用什么后缀)。 主要工作吗?是的它现在适合你。它会在以后引起问题吗?大概。它是一种好形式还是一种难以忘怀的解决方案?绝对不是。

最佳答案

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

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