2011-08-21 86 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

相关问题