2011-08-21 105 views
3

我正在使用std::unordered_map,我想用它來存儲指向我動態創建的對象的指針,它使用newC++ std :: unordered_map

我可以創建對象並且插入方法成功;但是,當我嘗試使用索引解析地圖中的特定對象時,顯示列表中的所有項目都映射到我在地圖中指向的最後一個項目。

typedef std::unordered_map<__int64, Session*> HashDict; 
HashDict dict; 

void Sessions::Insert() 
{ 
    Session* newSession = new Session; 
    newSession->setId(sessionCounter++); 
    dict.insert(HashDict::value_type(newSession->Id(), newSession)); 
} 

void Sessions::Find(__int64 id) 
{ 
    HashDict::iterator it = dict.find(id); 

    if(it != dict.end()) 
    { 
    Session* s = it->second; 
    std::cout << "Search for: " << id << std::setw(3) << 
       " found @ location: " << it->second << std::setw(3) << 
       " with value: " << s->Id() << std::endl; 
    } 
} 

001D4F50 0 
001D5038 1 
001D50D0 2 
001D5378 3 
001D5410 4 
001D54A8 5 
001D5540 6 
001D55D8 7 
001D5670 8 
001D4E50 9 
Search for: 5 found @ location: 001D54A8 with value: 9 

注意5點在5位置(從插件),但它說,該值是9

我在做什麼錯?

+4

你可以發佈'Session'的定義嗎? –

+0

@downvoters我希望你不要因爲你不喜歡谷歌的董事長而下決心! –

+0

創建後Id可以更改嗎? – bdonlan

回答

1

如果我不得不從輸出中猜出你有什麼可能是Session的ID字段標記爲static?如果是這樣,這將表現出你正在看到的行爲。特別是,如果該字段是靜態的,那麼每次創建和更新新會話的ID時,都會覆蓋在所有Session對象之間共享的ID字段,並且只會保留最後一個會話ID。

如果我完全錯了,讓我知道,我會刪除這個答案。

+0

情況就是這樣(紅臉)。我有在全局級別聲明的變量(在類範圍之外)。我將它們移至私人會員,結果現在是正確的。我在這裏學到的教訓是,在類定義之外聲明的成員默認是靜態的,因爲我沒有將它們標記爲這樣。我遇到的問題之一就是以下內容 - 「在定義頭文件時,是否有一種不同的機制來隱藏類的內部實現?」 –

+0

不是。在C++中,類定義必須完全可用於在大多數情況下使用類,因爲編譯器必須知道對象的大小,它的佈局等。有一些技術試圖隱藏實現(Google搜索「例如「pImpl idiom」或「編譯器防火牆」),但最終它們會以效率爲代價。 – templatetypedef

+1

@Eric:您的聲明「在類定義之外聲明的成員默認是靜態的」,這有點讓人誤解。不幸的是,在C++中,「靜態」意味着許多不同的事情取決於上下文。特別是_inside_一個類,它意味着其他的一些東西,就像_outside_一個類。在類之外定義的變量是_globals_。顧名思義,全局並不是特定於一個對象的。 – MSalters