2012-08-25 81 views
0

我寫了一個類變量,如下所示:C++靜態函數和

#include<iostream> 
using namespace std; 
class A 
{ 
static int cnt; 
static void inc() 
{ 
cnt++; 
} 
int a; 
public: 
A(){ inc(); } 
}; 
int main() 
{ 
A d; 
return 0; 
} 

我想通過構造函數調用的函數INC,但是當我編譯我得到一個錯誤:

/tmp/ccWR1moH.o: In function `A::inc()': 
s.cpp:(.text._ZN1A3incEv[A::inc()]+0x6): undefined reference to `A::cnt' 
s.cpp:(.text._ZN1A3incEv[A::inc()]+0xf): undefined reference to `A::cnt' 

我無法理解的錯誤... plz幫助......沒有定義

回答

3

靜態字段 - 看看Why are classes with static data members getting linker errors?

#include<iostream> 
using namespace std; 
class A 
{ 
    static int cnt; 
    static void inc(){ 
    cnt++; 
    } 
    int a; 
    public: 
    A(){ inc(); } 
}; 

int A::cnt; //<---- HERE 

int main() 
{ 
    A d; 
    return 0; 
} 
+0

爲什麼會這樣?如果我們只在課堂內聲明它,這還不夠嗎? – nitish712

+0

您也可能會考慮初始化該值。不知道編譯器是否會分配一個默認值。我總是賭「不」,只是爲了確保。 –

+4

@ nitish712如果該類是在頭中定義的,則它可能以多個翻譯單元(源文件)結尾。編譯器必須任意選擇一個來保存定義。它不是隨意選擇一個,而是迫使你做出選擇。 (從技術上講,它甚至可能無法做出選擇,因爲傳統上編譯器一次只能看到一個源文件。) –

1

static int cnt;裏面只聲明瞭,需要定義。在C++中,通常在.h .hpp文件中聲明,然後在.c和.cpp文件中定義靜態類成員。

在你的情況,你需要添加

int A::cnt=0; // = 0 Would be better, otherwise you're accessing an uninitialized variable. 
+0

'= 0'不是需要; 'int A :: cnt;'將被初始化爲0。 –