静态类成员获取“未定义的引用”。不知道为什么

时间:2012-04-08 18:18:43

标签: c++ static class-members

我不知道这段代码有什么问题。我有以下非常简单的课程:

class SetOfCuts{
public:

  static LeptonCuts   Leptons;
  static ElectronCuts TightElectrons;
  static ElectronCuts LooseElectrons;
  //***
  //more code
};

,例如,类型ElectronCuts之前在.h文件中定义为:

struct ElectronCuts{
  bool Examine;
  //****
  //other irrelevant stuff
};

我认为没有什么太复杂的。

我的理解是,在主程序中,我可以做到:

SetOfCuts::LooseElectrons.Examine = true;

但如果我这样做,我会得到:

 undefined reference to `SetOfCuts::LooseElectrons'

相反,如果我这样做:

 bool SetOfCuts::LooseElectrons.Examine = true;

我明白了:

error: expected initializer before '.' token

我不知道为什么我无法访问结构的成员。我遗漏了一些关于静态数据成员的明显内容,但我不知道它是什么。

非常感谢。

2 个答案:

答案 0 :(得分:4)

任何静态引用也必须在特定的源文件中声明(而不仅仅在头文件中),因为它必须存在于链接完成的某个地方。

例如,如果您在Foo.h

中有此信息
class SetOfCuts{
public:

  static LeptonCuts   Leptons;
  static ElectronCuts TightElectrons;
  static ElectronCuts LooseElectrons;
};

然后在Foo.cpp中你会有

#include <Foo.h>
LeptonCuts SetOfCuts::Leptons = whatever;
ElectronCuts SetOfCuts::ThighElectrons = whatever;
..

最后在你的main.cpp中你可以做到

#include <Foo.h>
SetOfCuts::Leptons = whatever;

答案 1 :(得分:3)

您收到的“未定义引用”错误是一个链接器错误,表示您声明了静态数据成员,但您实际上并未定义它们任何地方。在C ++中,使用静态变量有两个步骤 - 首先在类中指定它,就像你已经完成的那样,然后必须在某个地方实际定义它。这与在头文件中定义函数的方式类似 - 您在头文件中对函数进行原型设计,然后在源文件中提供实现。

在您的情况下,在您已实现SetOfCuts成员函数的源文件中,添加以下行:

LeptonCuts SetOfCuts::Leptons;
ElectronCuts SetOfCuts::TightElectrons;
ElectronCuts SetOfCuts:LooseElectrons;

这告诉C ++实际定义静态成员的翻译单元。如果您愿意,也可以在此处指定构造函数参数。请注意,您在此处重复static关键字。

希望这有帮助!