2013-06-19 5 views
1

제발, 내 코드 좀 봐.map/set iterator는 참조 할 수 없습니다. C++ map

int main() { 
    Program* allcommand = new Program; 
    allcommand->addCommand("add", new Add); 
    allcommand->addCommand("convert", new Convert); 
    allcommand->addCommand("exit", new Exit); 
    allcommand->addCommand("help", new Help); 
    allcommand->addCommand("show", new Show); 
    allcommand->addCommand("modify", new Modify); 

    std::string input; 
    Command* obj; 
    while (true) { 
     std::cout << "\nCommand >> "; 
     std::getline(std::cin, input); 
     std::map<std::string, Command*> :: iterator it; 
     std::vector<std::string> parsedinput = allcommand->parse(input); 

     it = allcommand->getCommands().find(parsedinput[0]); 
     obj = it->second; 

     obj->start(parsedinput); 
     delete obj; 
    } 

    return 0; 
} 

명령 이름과 해당 포인터를 포함하는 맵에 명령을 등록합니다. 이 명령은 문제없이 컴파일되지만 명령을 입력하면 "map/set iterator in dereferencable"과 충돌합니다. 나는지도를 처음 사용하기 때문에 몇 분이면 도움이됩니다.

EDIT. 좋아, 내가 문제가 주요에없는 것을 발견 ... 다음은 프로그램 클래스의 코드 (그 중 일부)

void Program::addCommand(std::string command1, Command* obj) { 
    m_allCommands[command1] = obj; 
} 

std::map<std::string, Command*> Program::getCommands() { 
    return m_allCommands; 
} 

나는 내가 주에서 명령을 등록한 후, 나는이를 법원 수 없기 때문에 문제가 여기 생각입니다 당신이

if(it == allcommand->getCommands().end()) { 
    //Not Found 
} else { 
    obj = it->second; 
    obj->start(parsedinput); 
} 
+0

시도가 후'it'을 확인하는이'그것은 = allcommand-> getCommands() 발견 (parsedinput [0]) ;'라인. – soon

+0

동일한 문제가 있는데, 그 줄 뒤에있는 모든 것을 제거하고 처음부터 문자열 인 것입니다. – khajvah

+0

'it'가'allcommand-> getCommands(). end()'와 같지 않은지 확인하려고합니다. , 즉 명령이 존재하는지 확인하십시오. 또한 디버거를 사용하여 오류를 throw하는 줄을 찾으십시오. – soon

답변

3
std::map<std::string, Command*> Program::getCommands() { 
    return m_allCommands; 
} 

m_allcommands지도의 사본을 반환하는 경우 확인해야 find()를 호출 한 후 모든 명령 (같은 문제)

+0

대단한 사람,이 덕분에 대단히 고마워. 문제. 확인 명령을 입력 할 때 먼저 확인하고 작동하지만 두 번째 명령을 입력하면 충돌합니다 (여기에 묻는 것이 좋을지 모르겠 음) – khajvah

+0

'obj'를 삭제하지 마십시오. 동일한 명령을 두 번 입력하면 명령 개체가 내부 맵에서 계속 살아 있어야합니다. 명령 객체를 삭제할 곳은'Program :: ~ Program()'입니다. – rectummelancolique

+0

대단히 감사합니다 :) – khajvah

2

의 이름을 지정합니다. 그래서 당신은 수행 할 때

it = allcommand->getCommands().find(parsedinput[0]); 

당신은 할당이 완료되면 파괴됩니다 allcommand->getCommands()에 의해 반환 된 임시 개체에 대한 반복자를 얻을. 그러므로 그것은 아무 것도 가리 키지 않습니다.

변경 getCommands()에 :

std::map<std::string, Command*>& Program::getCommands() { 
    return m_allCommands; 
} 

또는 더 나은 :.

const std::map<std::string, Command*>& Program::getCommands() const { 
    return m_allCommands; 
} 
+0

제발, 같은 코드를 다시 보아주세요. (일부 정보를 추가했습니다) – khajvah

+0

올바른 명령을 입력하면이 경우가되어서는 안됩니다 ... – khajvah

+0

누군가가 말했듯이 처음으로 일어나는 일입니까? 위의 명령을 사용하면'obj'를 호출해서는 안된다. 그 명령은 영원히 사라질 것이다. 충분한 코드를 게시하지 않았습니다. 디버거를 사용하는 경우 잘못된 역 참조가 발생한 행을 가리킬 수 있어야합니다. – Salgar

관련 문제