静态类成员获得“未定义的引用”。不知道为啥
Posted
技术标签:
【中文标题】静态类成员获得“未定义的引用”。不知道为啥【英文标题】:static class member gets "undefined reference". Don't know why静态类成员获得“未定义的引用”。不知道为什么 【发布时间】:2012-04-08 18:18:42 【问题描述】:我不知道这段代码有什么问题。我有以下非常简单的类:
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
我不知道为什么我不能访问结构的成员。我遗漏了一些关于静态数据成员的明显内容,但我不知道它是什么。
非常感谢。
【问题讨论】:
【参考方案1】:任何静态引用也必须在特定的源文件中声明(不仅在头文件中),因为它必须在链接完成时存在于某个地方。
例如,如果您的 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;
【讨论】:
【参考方案2】:您遇到的“未定义引用”错误是一个链接器错误,表明您已声明静态数据成员,但实际上并未定义它们任何地方。在 C++ 中,使用静态变量有两个步骤 - 您首先在类中指定它,就像您所做的那样,然后必须在某处实际放置它的定义。这类似于在头文件中定义函数的方式——在头文件中对函数进行原型设计,然后在源文件中提供实现。
在您的情况下,在您为SetOfCuts
实现成员函数的源文件中,添加以下行:
LeptonCuts SetOfCuts::Leptons;
ElectronCuts SetOfCuts::TightElectrons;
ElectronCuts SetOfCuts:LooseElectrons;
这告诉 C++ 在哪个翻译单元中实际定义了静态成员。如果您愿意,也可以在此处指定构造函数参数。请注意,您不要在此处重复 static
关键字。
希望这会有所帮助!
【讨论】:
以上是关于静态类成员获得“未定义的引用”。不知道为啥的主要内容,如果未能解决你的问题,请参考以下文章
为啥 glut.h 会在 CodeBlocks 中弹出一堆未定义的引用?