【发布时间】:2013-06-19 09:32:44
【问题描述】:
请看一下我的代码。
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 not dereferencable”而崩溃。我是地图新手(几分钟),所以请帮忙。
编辑。好的,我发现问题不在 main... 这是 Program 类的代码(其中一些)
void Program::addCommand(std::string command1, Command* obj) {
m_allCommands[command1] = obj;
}
std::map<std::string, Command*> Program::getCommands () {
return m_allCommands;
}
我认为问题出在这里,因为我在 main 中注册命令后,我无法找到任何命令的名称(同样的问题)
【问题讨论】:
-
尝试在
it = allcommand->getCommands().find(parsedinput[0]);这一行之后检查it。 -
同样的问题,当我删除该行之后的所有内容并尝试计算它时->首先是字符串
-
我的意思是,尝试检查
it是否与allcommand->getCommands().end()不同,即检查命令是否存在。也尝试使用调试器并找到引发错误的行。 -
小心你的
delete obj;,在当前代码中它会在地图中留下一个悬空指针。