1

请看一下我的代码。

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”而崩溃。我是地图新手(几分钟),所以请帮忙。

编辑。好的,我发现问题不在主要...这是程序类的代码(其中一些)

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

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

我认为问题出在这里,因为在我在 main 中注册命令后,我无法找到任何命令的名称(同样的问题)

4

2 回答 2

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;
}
于 2013-06-19T10:08:47.467 回答
2

打电话给您后,find()您需要检查是否

if(it == allcommand->getCommands().end()) {
   //Not Found
} else {
   obj = it->second;
   obj->start(parsedinput);
}
于 2013-06-19T09:39:26.230 回答