2011-08-21 6 views
3

나는 std::unordered_map을 사용하고 있으며 동적으로 생성하는 객체에 포인터를 저장하는 데 new을 사용하고 싶습니다.C++ std :: unordered_map

개체를 잘 만들 수 있으며 삽입 메서드가 성공합니다. 그러나 색인을 사용하여지도에서 특정 객체를 분석하려고하면 목록의 모든 항목이지도에서 가리키는 마지막 항목에 매핑됩니다. (삽입)에서 5의 위치에 5 점은, 그러나 그것은 값이 9 것을 말한다

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 

알 수 있습니다.

내가 뭘 잘못하고 있니?

+4

'세션'의 정의를 게시 할 수 있습니까? –

+0

@downvoters Google의 의장을 싫어하기 때문에 다운 투표하지 않기를 바랍니다! –

+0

생성 후 ID가 변경 될 수 있습니까? – bdonlan

답변

1

출력 결과를 추측해야한다면, 세션의 ID 필드가 정적이라고 표시되어 있습니까? 그렇다면 여기에있는 행동과 정확히 일치해야합니다. 특히 필드가 정적 인 경우 새 세션의 ID를 만들고 업데이트 할 때마다 모든 세션 개체에서 공유되는 ID 필드를 덮어 쓰고 마지막 세션 ID 만 유지됩니다.

내가 완전히 틀린 경우 알려 주시면 답변을 삭제하겠습니다.

+0

이 경우 (빨간 얼굴). 변수를 클래스의 전역 수준 (클래스 범위 외부)에서 선언했습니다. 나는 그것들을 비공개로 옮겼다 : 회원들과 결과는 이제 정확하다. 이 교훈은 클래스 정의 외부에서 선언 된 멤버가 기본적으로 정적 인 것으로 나타났습니다. 내가 가진 질문 중 하나는 다음과 같다. "헤더 파일을 정의 할 때 클래스의 내부 구현을 숨기는 다른 메커니즘이 있습니까?" –

+0

아닙니다. C++에서는 컴파일러가 객체의 크기, 레이아웃 등을 알아야하기 때문에 대부분의 컨텍스트에서 클래스를 사용할 수 있도록 클래스 정의를 완전히 사용할 수 있어야합니다. 구현을 숨기려는 기술이 있습니다 (" pImpl idiom "또는"compiler firewall ")을 사용하지만 궁극적으로는 효율성을 희생합니다. – templatetypedef

+1

@Eric : "클래스 정의 외부에서 선언 된 멤버는 기본적으로 정적입니다."라는 문장은 오해의 소지가 있습니다. 불행하게도, C++에서'정적 인 '이란 문맥에 따라 많은 다른 것들을 의미합니다. 특히 _inside_ 클래스는 _outside_ 클래스로서 다른 것을 의미합니다. 클래스 외부에서 정의 된 변수는 _globals_입니다. 이름에서 알 수 있듯이 전역은 하나의 객체에만 국한된 것이 아닙니다. – MSalters

관련 문제