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」でクラッシュします。私は地図が初めてです(数分)ので、助けてください。

編集。OK、問題はメインではないことがわかりました...これがProgramクラスのコードです(一部)

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

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

メインにコマンドを登録した後、コマンドの名前を数えることができないため、問題はここにあると思います(同じ問題)

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 に答える