3

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

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

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

非常感谢。

4

2 回答 2

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;
于 2012-04-08T18:22:46.087 回答
3

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

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

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

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

希望这可以帮助!

于 2012-04-08T18:22:38.260 回答