0

私は自分で開発した作品を持っています.以下では、型キャストと例外発生の問題があります:

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


class WithdrawlCheck
{
int Balance;
int amount;
string s;
public:
void  CheckBalance()
{
    cout<< "Sorry,You don't have Balance to Perform this transaction";
}
void WithdrawlCash(int Balance)
{
    if(Balance<500)
    {
    //cout<< "Sorry,You don't have Balance to Perform this transaction";
    CheckBalance();
    }
    else
    {
        cout<<"enter the amount to withdrawl only in digits"<<endl;
        try
        {
           cin>>amount;
        }
        catch(exception c)
        {
            cout<<"please enter proper values"<<endl;
            WithdrawlCash(Balance);
        }
        if(Balance>amount)
        {
        Balance=Balance-amount;
        cout<<"Your current Balance is:"<<Balance<<endl;
        }
        else{
        cout<<"Insufficient Balance";
        }
    }
    cout<<"do you want to Perform More Transaction,Say Y/N"<<endl;
    cin>>s;
    int num=s.compare("exit");
    int n1=s.compare("Y");
    int n2=s.compare("y");
    if(num==0||n1==0||n2==0)
    {
    WithdrawlCash(Balance);
    }
    else
    {
    cout<<"Bye";
    exit(0);
    }
}

};
int main()
{
  int Bal;
  cout<<"**********"<<"Welcome User"<<"*********"<<endl;
  cout<<"Enter the Balance"<<endl;
 cin>>Bal;
 WithdrawlCash c;
 c.WithdrawlCash(Bal);
 }

したがって、ここでの問題は、ユーザーがアルファベットの値を入力すると、catch によってキャッチされ、メッセージが表示されるはずですが、無限ループに入り、中断せずに cout ステートメントを実行することです。この例外をキャッチする方法と方法を教えてください。ユーザーが C++ でのみ数字を入力するように制限できます。

4

2 に答える 2

1

cin >> s通常は例外は発生しません。のを設定するだけfailbit()で、cinフェイルビットをクリアするまで以降の操作は失敗します。適切な治療は次のようになります

while (!(cin >> s)) {   // the '!' operation checks whether the 'cin' object has failed
    // handle failure and retry
    cin.clear();   // clear failbit
    cin.ignore(INT_MAX, '\n');   // ignore invalid input.
    cout<<"please enter proper values"<<endl;
}
于 2012-10-22T10:22:57.470 に答える
1

デフォルトでは、無効な iostream コマンドはスローされませんが、ストリームに失敗した状態が残ります。

ただし、投げさせることはできます。

http://www.cplusplus.com/reference/iostream/ios/exceptions/

このフラグが設定されている場合でも、iostream バッファーの失敗したビット状態をクリアする必要があるかどうかはわかりません。とにかくやる価値はありそうです。(cin.clear()cin.ignore())

于 2012-10-22T10:20:59.380 に答える