std::istream & operator >>(std::istream & ins, Rational & target)
{
int num, den;
char symb;
std::cout << "Please enter a rational number: ";
ins >> num >> symb >> den;
std::cout << std::endl;
if(validateInput(num, symb, den)){
target = Rational(num, den);
return ins;
}
else{
std::cin >> target;
}
}
bool validateInput(int num, char symb, int den)
{
if(symb != '/'){
std::cout << "Error: Illegal format. Please use '2/4'." << std::endl;
return false;
}
if((static_cast<int>(num) != num) && (static_cast<int>(den) != den)){
std::cout << "Error: Not a valid rational number." << std::endl;
return false;
}
if(den == 0){
std::cout << "Error: Cannot divide by 0." << std::endl;
return false;
}
return true;
}
它採用'x/y'格式的有理數,例如2/4。 它工作正常,如果我鍵入它的權利。如果我輸入2p4,它會給出正確的錯誤(我錯過了一個'/'),然後要求一個新的號碼。如果分母中有0,它也會報告錯誤並要求輸入一個新的數字。當我檢查錯誤時,在我的過載的>>運算符中出現無限循環
但檢查看看它是否是一個有效的數字似乎沒有工作。如果我輸入'a/4',它會無限循環,直到它崩潰。我無法弄清楚爲什麼。檢查調試器,它會返回到ins >>語句,但不會詢問用戶的任何內容。
我假設我的邏輯是錯誤的地方。請注意,我對C++相當陌生,仍在學習。我之前嘗試異常處理,仍然沒有正確地學習,所以我重新回到了我更熟悉的東西上。
謝謝!
這段代碼似乎違背了操作符重載的良好做法,可以改進。首先,不要通過cout提示用戶輸入值,因爲控制檯可能不可用,比如應用程序在後臺運行。其次,'validateinput()'中的static_cast語句將始終工作,因爲輸入已經被分解爲這些類型的行,這些行類型爲ins >> num >> symb >> den;'。第三,驗證應該在Rational構造函數中執行。它應該拋出一個異常,如果這些值是無效的,但我接受你正在努力。 – akton
我可能應該在我的文章中更具體。這是一個控制檯應用程序,這是我分配給課程的一個項目。我希望Rational構造函數能夠進行驗證,但問題是,該項目特別要求程序要求用戶以這種格式輸入一個有理數:'2/4'。所以當它要求我輸入第一個數字時,我必須輸入2/4。理性構造函數將無法檢查/是否被輸入,所以這就是爲什麼我在>>函數中進行驗證的原因。我可能在這方面非常錯誤,因爲我很新,所以如果我是的話請糾正!謝謝 –
不夠公平。在這種情況下,首先,我不會在操作員超載時提示用戶。出於上述原因,我會將其移至不同的功能。其次,使用'ins >> num >> symb >> den;'拉入數據可以在每個元素之間留出空白。我不知道規範是什麼,但可能不允許。你可能想'ins >> num''然後使用ins.peek()來查看下一個字符是什麼。 – akton