静态类成员获得“未定义的引用”。不知道为啥

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 中弹出一堆未定义的引用?

为啥它显示像 ld 返回 1 退出状态和未定义的引用 `powr(int, int)' 之类的错误

OpenACC nvlink 未定义类的引用

在 Windows 上编译静态 Qt 构建时未定义的引用