请看看我的代码。
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”。我是地图的新手(几分钟)所以请帮忙。
EDIT。好的,我发现问题不在主...这是程序类的代码(其中一些)
void Program::addCommand(std::string command1, Command* obj) {
m_allCommands[command1] = obj;
}
std::map<std::string, Command*> Program::getCommands () {
return m_allCommands;
}
我认为问题出在这里,因为我在main中注册命令后,我无法查出任何命令的名称(同样的问题)
答案 0 :(得分:3)
std::map<std::string, Command*> Program::getCommands () {
return m_allCommands;
}
返回m_allcommands
地图的副本。所以当你这样做时:
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;
}
答案 1 :(得分:2)
致电find()
后,您需要检查是否
if(it == allcommand->getCommands().end()) {
//Not Found
} else {
obj = it->second;
obj->start(parsedinput);
}