2016-02-22 180 views
1

我已經開始使用Java進行編程,剛剛完成了我認爲在語言知識方面的「良好」級別。聲明C++靜態成員變量的「未定義引用」

爲了好玩,我決定開始使用C++編程,我對這門語言很陌生,但我是一名快速學習者,我認爲它離Java不遠。

我創建了一個測試類,它有一個值和一個名稱作爲屬性,一個對象計數器作爲全局變量。

#include<iostream> 


/* local variable is same as a member's name */ 
class Test 
{ 
    private: 
     double x; 
     std::string name; 
     static int nb; 
    public: 
     Test(double x, std::string n) 
     { 
      this->x=x; 
      this->name=n; 
      nb=nb+1; 
     } 
     void setX (double x) 
     { 
      // The 'this' pointer is used to retrieve the object's x 
      // hidden by the local variable 'x' 
      this->x = x; 
     } 
     double getX() 
     { 
      return this->x; 
     } 
     std::string getName() 
     { 
      return this->name; 
     } 

     static int getNb() 
     { 
      return nb; 
     } 

}; 


int main() 
{ 
    Test obj(3.141618, "Pi"); 
    std::cout<<obj.getX()<<" "<<obj.getName()<<" "<<Test::getNb()<<std::endl; 
    return 0; 
} 

當執行PROGRAMM輸出這個錯誤:

In function `Test::Test(double, std::string)': 
(.text._ZN4TestC2EdSs[_ZN4TestC5EdSs]+0x4a): undefined reference to `Test::nb' 
(.text._ZN4TestC2EdSs[_ZN4TestC5EdSs]+0x53): undefined reference to `Test::nb' 
In function `Test::getNb()': 
(.text._ZN4Test5getNbEv[_ZN4Test5getNbEv]+0x6): undefined reference to `Test::nb' 
error: ld returned 1 exit status 

一些中國給我。

我不明白。

+0

'試驗(雙X,的std :: string){這個 - > X = X;這 - >名= N; NB = NB + 1; }'可以寫得更乾淨,就像'Test(double x_,std :: string name_):x(x_),name(name_){++ nb; }'。使用初始值設定項,只要你可以贏得勝利和proffit。 – kfsone

+0

好問題。所使用的代碼可以縮減很多,但其他方面很簡單並且重點突出。無法持有重複對他們,因爲這是很難谷歌,直到你知道關鍵字。 – user4581301

回答

4

在C++中,static變量本質上是全局變量周圍的語法糖。就像全局變量,它們必須在一個源文件中定義,有:

int Test::nb; 

,如果你想與特定的值進行初始化,

int Test::nb = 5; // or some other expression 
+0

Thx很多,我已經看到了這個,但無法弄清楚目的,我應該閱讀關於C結構來幫助理解。 – Aleks

0

你的變量static int nb需求被初始化,所以你需要在課後添加一個聲明。

class YourClass 
{ 
    // some stuff 
}; // Your class ends here 
int Test::nb = 0; 

int main() ... 

這裏的一些教程和信息tutorial pointcprogramming.com/tutorial/statickeyword

+0

定義(不是你稱之爲「聲明」)不應該在頭文件中(你的答案看起來像你建議在類定義之後把它寫在頭上) –

+0

@MM你的權利是'定義'不應該在頭文件中。我假定這個整個例子是在一個main.cc文件中編寫的,因爲類定義之後是主函數。 – amisam