2013-06-19 25 views
1

請看看我的代碼。map/set iterator是不可取的C++ map

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

它向包含其命令名稱和指向其類的映射註冊命令。 這個編譯沒有問題,但當我輸入一個命令,它崩潰與「地圖/設置迭代器不可取消」。我是新來的地圖(幾分鐘),所以請幫助。

編輯。好吧,我發現這個問題是不是在主...這裏是程序類的代碼(有些)

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

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

我覺得問題就在這裏,因爲在我註冊主的命令,我不能清點了任何命令(同樣的問題)

+0

嘗試之後檢查'it'此'它= allcommand-> getCommands()找到(parsedinput [0]) ;'線。 – soon

+0

同樣的問題,當我刪除該行後的所有內容,並試圖cout它 - >第一,這是字符串 – khajvah

+0

我的意思是,嘗試檢查它是否與'allcommand-> getCommands()即檢查命令是否存在。也嘗試使用調試器並找到引發錯誤的行。 – soon

回答

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

偉大的人,這工作,非常感謝(仍然不能相信我錯過了)反正這打開了另一個問題。 OK,首先當我輸入命令時,它可以工作,但是當我輸入第二個命令時它崩潰(不知道在這裏問這是否好主意) – khajvah

+0

不要刪除'obj'。如果您輸入相同的命令兩次,您的命令對象仍需要在內部映射中保持活動狀態。刪除命令對象的地方在'Program ::〜Program()' – rectummelancolique

+0

非常感謝:) – khajvah

2

的名稱find()呼叫時,需要檢查是否

if(it == allcommand->getCommands().end()) { 
    //Not Found 
} else { 
    obj = it->second; 
    obj->start(parsedinput); 
} 
+0

請再次看看相同的代碼(我添加了一些信息) – khajvah

+0

這不應該是這樣,如果我輸入正確的命令... – khajvah

+0

這是發生在第一次還是第二次,正如有人說上面,你不應該在使用命令後調用'delete obj',因爲那個命令將永遠消失。你還沒有發佈足夠的代碼。如果你使用調試器,它應該能夠指向無效解除引用的行 – Salgar

相關問題