2012-03-23 154 views

回答

18

它無關,與在那裏你定義的功能,那就是你沒有定義靜態成員變量,你只宣佈它。您需要將其定義放在課程外部,例如

int TT::i; 
+1

+1刪除我的回覆,因爲我意識到你已經釘住了它。 – Lou 2012-03-23 04:11:33

+0

它的工作原理,謝謝 – user956159 2012-03-23 04:14:01

2

靜態變量保存在與任何類的任何實例不同的內存部分中。這是因爲他們不是任何階級的實例的一部分。

下面的代碼編譯是因爲函數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; 
} 

但是,此代碼不complie,因爲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; 
} 

你都不允許有你就不是在C使用未定義的引用++(和C爲此事)。出於某種原因,我不確定,編譯器似乎認爲這個代碼引用了我,當上面那些符合條件的東西沒有被引用時才引用它(有關爲什麼)。

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

//int TT::i = 0; 

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

功能例如,用定義的靜態:

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

int TT::i = 0; 

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

他得到的'未定義的引用'錯誤是一個鏈接器錯誤,而不是編譯器錯誤。 – 2012-03-23 04:27:29

+0

絕對正確。我有一個不好的習慣,就是在我的「Compile Output」控制檯中調用任何出現編譯器錯誤的東西。 – 2012-03-23 04:35:10

+0

這是一個更完整的答案! :d – kotoko 2016-11-17 08:42:26

3

未定義參考`TT ::我」

是因爲你還沒有外部類中定義的靜態數據成員。所有靜態數據成員必須在使用它們之前在類之外定義。

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