1

我有一段需要大量用户输入的代码。我想确保用户输入了正确的输入类型,如果没有,提示他们输入正确的内容。

现在我可以通过包含所有可能输入的大量if语句来做到这一点,但我确信一定有更好、更有效的方法。我已经看到了一些可能的替代解决方案(例如typeid, throw/catch),但它们似乎在这是否是一种好的编程技术方面存在分歧。

那么解决这个问题的最佳方法是什么?

我从传入的输入中概述了我知道/需要的内容:

  • 我知道用户应该输入什么类型(它们是ints,doublesstrings)。
  • 我需要检查他们是否输入了正确的输入,如果没有提示他们输入 type 的输入X
  • 代码最好需要存储在函数(或模板等)中,并且适用于所有 3 种情况,因为需要执行此检查/读取的情况很多。

我还应该注意我正在使用getline(cin,X),因为我的一些输入包含空格。这是我所指的代码:

        while(again==1){
            cout<<"Please enter student name: "<<endl;
            sName=clear_and_read<string>();
            cout<<"Please enter student ID: "<<endl;
            sID=clear_and_read<int>();
            cout<<"What course does the student study? (1)Physics etc...."<<endl;
            sCourse=clear_and_read<int>();
            cout<<"How many results would you like to enter for this student?: "<<endl;
            d=clear_and_read<int>();
            student* S1= new physics(sName,sID);  //*********
            //physics S1(sName,sID);
            if(sCourse==1){
                for(int i(0);i<d;i++){
                    string cName("Nill"); double cResult(0);int cCode(0);
                    cout<<"Please enter course "<<i+1<<" code: "<<endl;
                    cCode=clear_and_read<int>();
                    cout<<"Please enter course "<<i+1<<" title: "<<endl;
                    cName=clear_and_read<string>();;
                    cout<<"Please enter result "<<i+1<<": "<<endl;
                    cResult=clear_and_read<double>();;
                    (*S1).addresult(cName,cCode,cResult);
                }           
            }
            //allstudents.insert(pair<int,student*>(sID,S1)); //********* 
            allstudents[sID]=S1;    //THIS LINE
            cout<<"Would you like to enter another student manually? (1)Yes (2)No :"<<endl;
            again=clear_and_read<int>();;
        }

目前我在哪里制作了未完成的模板函数clear_and_read,该函数将检查传入的数据是否与输入到模板中的数据相同,但我被困在如何做到这一点上。

template <class T> T clear_and_read(){ //NOT CORRECT YET
    string name;
    cin.ignore();//skips "enter" still in cin stream
    cin.clear();
    getline(cin,name);
    T typeoutput;



    //needs to check for valid type
        //assign name to typeoutput
    return typeoutput;
}

在插入这个模板类之前,代码sName=clear_and_read<string>();本来就是getline(cin,sName);等等。

作为旁注,我所说的“相当数量的if语句”的意思是,在每个必需的输入之后都需要一个 if-check/else 语句。

我是不是把事情复杂化了?

希望这很清楚。

4

0 回答 0