2013-10-12 88 views
3

我在使用靜態映射作爲C++成員時遇到了問題。我的頭文件是:靜態映射作爲C++中的類成員

class Article 
{ 
public: 
// 
static map<string,Article*> dictionary; 
.... 
.... 
}; 

在我的構造函數中我調用下面的方法首先:

void Article::InitializeDictionary() 
{ 
    #ifndef DICT 
    #define DICT 
    map<string,Article*> Article::dictionary; 
    #endif 
} 

基於這個其他職位,我應該聲明靜態成員,但是當我嘗試這樣做我得到以下錯誤:

Error 1 error C2655: 'Article::dictionary' : definition or redeclaration illegal in current scope c:\.......\article.cpp 88 1 

如果我改變功能如下:

void Article::InitializeDictionary() 
{ 
    #ifndef DICT 
    #define DICT 
    Article::dictionary["null"] = 0; 
    #endif 
} 

我得到這個錯誤:

Error 1 error LNK2001: unresolved external symbol "public: static class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class Article *,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class Article *> > > Article::dictionary" ([email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected][email protected][email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected]@@[email protected]@[email protected]@A) 

什麼我可以做任何想法?

+0

你不能在方法中定義靜態成員 –

+0

如果我在類聲明後在頭文件中聲明它,我會得到相同的第一個錯誤。 – Kyle

+0

[未定義的靜態類成員引用](http:// stackoverflow。com/questions/272900/undefined-reference-to-static-class-member) – juanchopanza

回答

9

你必須正確地聲明和定義靜態成員(在方法這樣做是不對的):

class Article 
{ 
public: 
// 
static map<string,Article*> dictionary; 
.... 
.... 
}; 

map<string,Article*> Article::dictionary; 

int main() { 
    //.. 
} 

你問的評論:

I tried doing this after the class declaration and got an error but if I do this in the .cpp file where the function definitions are it works. Why is that?

由於靜態成員之間共享一個類的所有實例,它們必須在一個且僅有一個編譯單元(地點)中定義。真的,它們是具有一些訪問限制的全局變量。

如果您嘗試在標題中定義它們,將會在中每模塊中定義它們,包括該標題,並且您會在鏈接期間收到錯誤,因爲它會找到所有重複的定義。

+0

我在類聲明後嘗試這樣做,但得到一個錯誤,但如果我在.cpp文件中執行函數定義,這是爲什麼? – Kyle

+0

@凱爾請參閱更新 – 4pie0

5

在你的類中聲明靜態沒有任何問題。

但是,您需要告訴編譯器爲靜態成員保留存儲空間:您需要定義它。要做到這一點包括行

map<string,Article*> Article::dictionary; 
只有一個編譯單元,並在全球 範圍

;即不在方法或命名空間中。

正常的做法是將該行放在與您的Article類關聯的源文件中。如果你把這行放在一個頭文件中,那麼多個編譯單元可以定義它,它會給你鏈接錯誤。即使包括警衛,這也會發生。

重要的是要注意,map的初始化將在程序的main函數運行之前發生。