2012-04-08 10 views
3

このコードで何が問題なのか分かりません。例えば、型ElectronCutsは同じ.hファイルで前に定義され、静的クラスメンバは "未定義参照"を取得します。理由を知らない

class SetOfCuts{ 
public: 

    static LeptonCuts Leptons; 
    static ElectronCuts TightElectrons; 
    static ElectronCuts LooseElectrons; 
    //*** 
    //more code 
}; 

と:私は、次の、非常にシンプルな、クラスを持っている

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

すべての静的リファレンスは、リンクが行われたときにどこかに存在する必要があるため、特定のソースファイル(ヘッダーファイルだけでなく)でも宣言する必要があります。例えば

あなたが最後にあなたのmain.cppににあなたが行うことができるようになります次に Foo.cppにあなたが

#include <Foo.h> 
LeptonCuts SetOfCuts::Leptons = whatever; 
ElectronCuts SetOfCuts::ThighElectrons = whatever; 
.. 

を持つことになり、あなたのFoo.h

class SetOfCuts{ 
public: 

    static LeptonCuts Leptons; 
    static ElectronCuts TightElectrons; 
    static ElectronCuts LooseElectrons; 
}; 

でこれを持っている場合

#include <Foo.h> 
SetOfCuts::Leptons = whatever; 
+0

ありがとう。それは多くの助けとなりました。 – elelias

3

「未定義の参照」エラーは、静的データメンバを宣言しましたが、あなたが実際にはどこでもにそれらを定義していないというリンカエラーです。 C++では、静的変数を使用するには2つのステップがあります。まず、クラス内でこれを指定した後、実際にその定義をどこかに置く必要があります。これはヘッダーに関数を定義する方法と似ています。ヘッダーで関数をプロトタイプ化してから、ソースファイルに実装を提供します。あなたのケースでは

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

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

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

希望すると便利です。

+0

ありがとう!、助けてくれました。多くのあなたの返信には多くの – elelias

関連する問題