【问题标题】: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

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

非常感谢。

【问题讨论】:

    标签: c++ static class-members


    【解决方案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 关键字。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2014-02-17
        • 2021-07-10
        相关资源
        最近更新 更多