2012-04-26 4 views
5

나는 사람들에게 클래스 이름을 가지고있다. 이 사람들에 대한 포인터를지도에 저장합니다.포인터로지도를 처리하는 방법은 무엇입니까?

map<string, People*> myMap; 

나는 [people]을 사용하여지도를 만듭니다.

myMap["dave"]->sayHello(); 

그러나 이것은 세그먼트 오류를 ​​제공하며 People 클래스의 생성자를 호출하지도 않습니다.

는 또한
myMap.insert(std::make_pair("dave", new People())); 

을 시도하지만 아무것도, 생성자가 아직 호출되지 않습니다 변경하지 않은 프로그램이 분할 오류이 코드 처리를 종료합니다.

포인터가 포함 된지도에 액세스하고 조작하려면 어떻게해야합니까? 왜 위의 작동하지 않는, 컴파일 시간 오류 또는 경고를 가져옵니다.

어떤 통찰력 많은 감사는지도 감안할 때 당신

답변

9

감사합니다 :

map<string, People*> myMap; 

operator[]

, 그것은 아무것도 가리 키지 않는, 즉 포인터 People*을 만들 수있는 새로운 People을 만들지 않습니다.

가장 간단한 해결책은

map<string, People> myMap; 

다음 메모리 관리가 모두 필요에 따라 새로운 사람들을 구성합니다 operator[]를 사용하여, 당신을 위해 처리 : 정말 예컨대, 사람이 아닌 포인터를 포함하는지도를 만드는 것입니다.

+1

또는 스마트 포인터, 'People'건설이 비싸면 –

+0

분명히 설명해 주셔서 감사합니다! – user1356190

2

는 생성자를 호출 포인터를 반환하고지도에 삽입합니다

myMap["dave"] = new People(....); 

new

를 사용해보십시오.

메모리 누수에주의해야합니다. 이 문제를 해결하기 위해 스마트 포인터를 사용하십시오.

+0

내 현재 구현에서 이것이 완벽하게 작동했습니다. – user1356190

0

People을 할당하고 맵을 사용하려는 경우 Boost Pointer Containers (특히 boost::ptr_map) 모양을 사용하십시오. 헤더 만 있으므로 추가 라이브러리를 컴파일 할 필요가 없습니다.

#include <iostream> 
#include <string> 
#include <boost/ptr_container/ptr_map.hpp> 

struct People 
{ 
    int age; 
}; 

typedef boost::ptr_map<std::string,People> PeopleMap; 

int main(int,char**) 
{ 
    PeopleMap data; 

    data["Alice"].age = 20; 
    data["Bob"].age = 30; 

    for (PeopleMap::const_iterator it = data.begin(); it != data.end(); ++it) 
     std::cout << "Name: " << it->first << " Age: " << it->second->age << std::endl; 

    return 0; 
} 
0

하여 사용해보십시오 : 그렇지

People* new_people = new People (member_variable1,member_variable2); 

myMap.insert(std::pair<std::string, People*>("key for string",new_people)); 

또는 :

People new_people(member_variable1,member_variable2); 
myMap.insert(std::pair<std::string, People*>("key for string",&new_people)); 

모두 작동합니다!

관련 문제