2014-12-15 14 views
-9

Я работаю над функцией в программе, чтобы читать ввод от пользователя, тогда функция будет проверять, существует ли эта функция, а затем запускает ее, но она очень глючна, и функции, предназначенные для запуска, выполняются дважды.Функция читает ввод и запускает функцию дважды

  //functions with a int and a string 
    std::map<std::string, std::function<void(int, string)>> functionsIS = { 
      {"printWordWithNumber", numberPlusWord}, 
    }; 
    //functions with no parameters 
    std::map<std::string, std::function<void()>> functionsNI = { 
      {"Help", userHelp}, 
    }; 
void CommandCheck(std::string command){ 
int paramInt; 
string paramString; 
for (int i = 0; i < functionsIS.size(); i = i++){ 
    if (functionsIS[command]){ 
     std::cout << "Accessed '" << command << "' reading requirements..." << std::endl; 
     std::cout << "Enter paramater one (integer) : "; 
     std::cin >> paramInt; 
     std::cout << std::endl<<"Enter paramater two (string)" << std::endl; 
     std::cin.ignore(); 
     std::getline(std::cin,paramString); 
     std::cout << "running..." << std::endl; 
     functionsIS[command](paramInt,paramString); 
    } 
} 
for (int i = 0; i < functionsNI.size(); i = i++){ 
    if (functionsNI[command]){ 
     std::cout << "Accessed '" << command << "' running..." << std::endl; 
     functionsNI[command](); 
    } 
} 
} 

Вот версия для запускать:

В источнике:

#include <iostream> 
#include <map> 
#include <windows.h> 
#include <string> 
#include <vector> 
#include <map> 
#include <functional> 

#include "userFunctions.h"//header file for functions 

using namespace std; 

std::string input; 
//functions with a int and a string 
std::map<std::string, std::function<void(int, string)>> functionsIS = { 
    { "printWordWithNumber", numberPlusWord }, 
}; 
//functions with no parameters 
std::map<std::string, std::function<void()>> functionsNI = { 
    { "Help", userHelp }, 
}; 

void CommandCheck(std::string command){ 
int paramInt; 
string paramString; 
for (int i = 0; i < functionsIS.size(); i = i++){ 
    if (functionsIS[command]){ 
     std::cout << "Accessed '" << command << "' reading requirements..." << std::endl; 
     std::cout << "Enter paramater one (integer) : "; 
     std::cin >> paramInt; 
     std::cout << std::endl << "Enter paramater two (string)" << std::endl; 
     std::cin.ignore(); 
     std::getline(std::cin, paramString); 
     std::cout << "running..." << std::endl; 
     functionsIS[command](paramInt, paramString); 
    } 
} 
for (int i = 0; i < functionsNI.size(); i = i++){ 
    if (functionsNI[command]){ 
     std::cout << "Accessed '" << command << "' running..." << std::endl; 
     functionsNI[command](); 
    } 
} 
} 

int main(){ 
do{ 
    std::cout << "Waiting For Command..." << std::endl; 
    cin >> input; 
    CommandCheck(input); 
} while (input != "end"); 


return 0; 
} 

Создать файл заголовка под названием "Функции" и вставить этот:

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

void numberPlusWord(int number, std::string word){ 
std::cout << word << std::endl; 
std::cout << number << std::endl; 
} 

void userHelp(){ 
std::cout << "I can help!" << std::endl; 
} 
+0

Ваш код не заполнен. Пожалуйста, ** отредактируйте ** свой пост и включите [MVCE] (http://stackoverflow.com/help/mcve). –

+2

** Никогда не делайте 'i = i ++' **. Это должно быть 'i ++'. – 0x499602D2

ответ

0

Есть несколько проблем с вашим кодом, которые могут вызвать проблемы. Во-первых, вы итерации через карту функций, и если команда существует, вы вызываете ее. Проблема в том, что вы проверяете одну и ту же команду на каждой итерации, поэтому, если в карте содержится более одного элемента, команда будет вызываться для каждого из них. Вы можете решить эту проблему, удалив цикл for и используя функцию find на карте, чтобы определить, существует ли команда.

Вторая проблема заключается в том, что если команда не существует, элемент будет создан на карте для нее. Оператор if будет автоматически вставлять элемент с помощью command в качестве ключа.

if(functionsIS[command]) { /*...*/} 

Данное обновление для вашего кода устранит неполадку.

void CommandCheck(std::string command) 
{ 
    int paramInt; 
    string paramString; 

    if (functionsIS.find(command) != functionsIS.end()) 
    { 
     std::cout << "Accessed '" << command << "' reading requirements..." << std::endl; 
     std::cout << "Enter paramater one (integer) : "; 
     std::cin >> paramInt; 
     std::cout << std::endl << "Enter paramater two (string)" << std::endl; 
     std::cin.ignore(); 
     std::getline(std::cin, paramString); 
     std::cout << "running..." << std::endl; 
     functionsIS[command](paramInt, paramString); 
    } 
    else if (functionsNI.find(command) != functionsNI.end()) 
    { 
     std::cout << "Accessed '" << command << "' running..." << std::endl; 
     functionsNI[command](); 
    } 
} 
+0

Спасибо, он отлично работает сейчас; Я не очень хорошо знаком с картами и их функциями, поэтому я действительно не знал о «.find()» – ezra