2012-03-23 21 views
9

可能性の重複:私は "TT`に未定義の参照:: i 'は、" エラーを得た理由は、私はクラス宣言の外の機能を実装する場合
What does it mean to have an undefined reference to a static member?C++メンバ関数のアクセスプライベート静的変数?

は、私は知らないのですか?ここで コードがそれはあなたが機能を定義した場所で行うには何もない...

class TT{ 
private: 
    static int i; 
public: 
    void t(); 
}; 

void TT::t(){ 
    i=0; 
} 

答えて

18

で、それはあなたが静的メンバ変数を定義していないということですが、あなたはそれを宣言しました。その定義をクラスの外に置く必要があります。

int TT::i; 
+1

+1私があなたがそれを釘付けにしたことを認識したため、私の応答を削除しました。 – Lou

+0

それは、ありがとう – user956159

2

静的変数は、クラスのどのインスタンスとも異なるメモリ部分に保存されます。これは、どのクラスのインスタンスのPARTでもないためです。

関数tが呼び出されないため、以下のコードがコンパイルされます。 tは

class TT 
{ 
private: 
    static int i; 
public: 
    void t() 
    { 
     i=0; 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    qWarning() << "hi"; 
    TT * t = new TT(); 
    t->t(); 
    return 0; 
} 

と呼ばれているので、

class TT 
{ 
private: 
    static int i; 
public: 
    void t() 
    { 
     i=0; 


    } 
}; 

int main(int argc, char *argv[]) 
{ 
    qWarning() << "hi"; 
    TT * t = new TT(); 
    //t->t(); 
    return 0; 
} 

しかし、このコードは、あなたがあなたが(そのことについて及びC)C++で使用していない未定義の参照を持つことが許され、complieしません。何らかの理由で、私は確信していますが、コンパイラは、このコードは私が参照するまで、それを参照していない上記のものは、参照していると思うようだ(任意のアイデア理由)?

class TT 
{ 
private: 
    static int i; 
public: 
    void t(); 
}; 

//int TT::i = 0; 

void TT::t(){ 
    i=0; 
} 

機能たとえば、定義された静的で:TT `へ

class TT 
{ 
private: 
    static int i; 
public: 
    void t(); 
}; 

int TT::i = 0; 

void TT::t(){ 
    i=0; 
} 
+2

彼が得ていた '未定義の参照'エラーは、リンカーエラーではなく、コンパイラーのエラーです。 –

+0

絶対に正しい。私は私の "コンパイル出力"コンソールに表示される何かを呼び出す悪い習慣をコンパイルエラーがあります。 –

+0

これははるかに完全な答えです! :D – kotoko

3

未定義の参照::私はあなたが、クラスの外の静的データメンバを定義したhaventので

があります」 。すべての静的データメンバーは、クラスを使用する前にクラス外で定義する必要があります。

class TT 
{ 
private: 
    static int i; 
public: 
    void t(); 
}; 

void TT::t() 
{ 
    i=0; 
} 
int TT::i=0; // define it outside the class. and if possible initialize 
関連する問題