我不知道这段代码有什么问题。我有以下非常简单的课程:
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
我不知道为什么我无法访问结构的成员。我遗漏了一些关于静态数据成员的明显内容,但我不知道它是什么。
非常感谢。
答案 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
关键字。
希望这有帮助!