gpt4 book ai didi

c++ - 映射/设置迭代器不是可取消引用的 C++ 映射

转载 作者:行者123 更新时间:2023-11-30 01:21:58 25 4
gpt4 key购买 nike

请看一下我的代码。

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”。我是 map 新手(几分钟)所以请帮忙。

编辑。好的,我发现问题不在 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中注册命令后,我无法计算出任何命令的名称(同样的问题)

最佳答案

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

返回 m_allcommands map 的拷贝。所以当你这样做时:

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;
}

关于c++ - 映射/设置迭代器不是可取消引用的 C++ 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17187757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com