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++ では、静的変数を使用するには 2 つの手順があります。最初に、これまで行ったようにクラスで指定し、次に実際にその定義をどこかに配置する必要があります。これは、ヘッダーで関数を定義する方法と似ています。ヘッダーで関数のプロトタイプを作成し、ソース ファイルで実装を提供します。

あなたの場合、 のメンバー関数を実装したソース ファイルにSetOfCuts、次の行を追加します。

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

これにより、静的メンバーが実際に定義されている翻訳単位が C++ に示されます。必要に応じて、ここでコンストラクター引数を指定することもできます。ここではキーワードを繰り返さないことに注意してください。static

お役に立てれば!

于 2012-04-08T18:22:38.260 に答える