2010-05-02 36 views
1

我是一名C程序員,但長期以來一直在學習C++ @school。現在我正試圖用C++編寫代碼,但遇到編譯器錯誤。請檢查並告訴我我的代碼有什麼問題。C++類靜態變量問題 - C++新手C程序員

typedef class _filter_session 
{ 
private: 
    static int session_count; /* Number of sessions count -- Static */  
public: 
    _filter_session();   /* Constructor */ 
    ~_filter_session();  /* Destructor */ 
}FILTER_SESSION; 


_filter_session::_filter_session(void) 
{ 
    (this->session_count)++; 
    return; 
} 


_filter_session::~_filter_session(void) 
{ 
    (this->session_count)--; 
    return; 
} 

,我得到的錯誤是

「錯誤LNK2001:無法解析的外部符號 」私人:靜態INT _filter_session :: SESSION_COUNT「(?SESSION_COUNT @ _filter_session @@ 0HA)」

我順便說一句,我正在使用Visual Studio 2005。

Plz plz幫助我。

問候,

微內核

+0

我只想保持活動會話數量的計數...... 然後我該怎麼做?如果它的全球可訪問性,班外的任何人都可以訪問和更改變量! – Microkernel 2010-05-02 11:55:48

+6

保留以'_'開頭的全局名稱。您正在編寫展示未定義行爲的代碼。 – 2010-05-02 12:01:33

回答

8

static變量需要是定義的以外的類體。類體內的聲明只是一個聲明。

E.g.在全局範圍內:

int _filter_session::session_count; 

你需要確保這個定義在程序中只發生一次,所以通常將其放置在一個源文件(.cc.cpp),而不是包含在不止一個頭文件一次翻譯單位。

爲了便於攜帶,您應該避免以_開頭的類名稱。你的班級名稱也很少需要。 class Name { //...在C++中引入了一個類型名稱,您不必使用class Name來引用該類型。

+0

我認爲這完全是在編譯單元完成的,或者我在這裏混合了一些東西。在標題中這樣做很可能會導致多重定義的符號。 – 2010-05-02 11:55:01

+0

是的,它需要滿足ODR並且只能在程序中定義一次,但由於構造函數和析構函數也在同一塊代碼中「超出行」定義,所以我猜測這不是頭文件或必須反正只有一次。 – 2010-05-02 11:57:37

+0

是的,這些功能都在一個單獨的C++文件中。感謝指出,沒有想過它;) – Microkernel 2010-05-02 12:02:36

0

只需使用session_count++。靜態變量不綁定到類的任何實例,因此無法通過this-指針訪問。您班級的所有實例共享session_count的一個實例。實際上,即使沒有您的課程實例存在,也可以訪問session_count

編輯好的,我的答案沒有解決問題,但Charles Bailey`s呢。

+0

我想要的只是保持活動會話的數量...... 那我該怎麼做呢?如果它的全球可訪問性,班外的任何人都可以訪問和更改變量! – Microkernel 2010-05-02 11:55:24

+0

@Microkernel:你錯過了Space_C0wb0y的觀點。無論如何,在課程'session_count'內部解析爲'_filter_session :: session_count'。因爲它是一個靜態變量'this-> session_count','_filter_session :: session_count'和'session_count'都指向同一個對象。沒有建議你讓全局變量。 – 2010-05-02 11:59:58

+0

變量仍然封裝在類中。 – Puppy 2010-05-02 12:45:47

1

不與你的問題,但在C++中有沒有必要的typedef類和結構是這樣的:

typedef class _filter_session 
{ 
    ... 
}FILTER_SESSION; 

可以而且應該簡單地說:

class filter_session 
{ 
    ... 
}; 

此外,C ; lass名稱通常不應該用大寫字母,因爲人們會將它們與宏混淆。而且你很少需要使用this->結構 - 你的代碼肯定不會。

1

您需要初始化靜態變量。此代碼實際上編譯:

typedef class _filter_session 
{ 
private: 
    static int session_count; /* Number of sessions count -- Static */  
public: 
    _filter_session();   /* Constructor */ 
    ~_filter_session();  /* Destructor */ 
}; // FILTER_SESSION; 

int _filter_session::session_count = 0; 


_filter_session::_filter_session(void) 
{ 
    session_count++; 
    return; 
} 


_filter_session::~_filter_session(void) 
{ 
    session_count--; 
    return; 
} 

int main(int argc, const char **argv) 
{ 
    return 0; 
} 

注意,我評論FILTER_SESSION彙編關於克++/Linux中,並且還添加了一個主要和除去這 - >(作爲另一構件提到,變量不是對象的屬性,但是這個班級,把它當作一個命名空間的全局變量)

+0

那麼是非成員函數可以訪問的靜態變量。 如果是這樣,如何確保session_count包含活動會話的數量? 感謝您的回覆:) – Microkernel 2010-05-02 11:59:54

+0

不,它不會被訪問,因爲它被宣佈爲私人。你可以用這種方式進行初始化並不意味着你可以在課堂外進行訪問。 – duncan 2010-05-02 12:12:51