2011-10-20 4 views
0

これまでどおり私はかなりC++の新人ですが、私はあまりにも専門用語ではありません。どちらかといえばあらかじめあいまいに耳を傾けてお詫びします!オペレータのヘルプのオーバーロード?

私の問題は、私のwhileループが私のオーバーロードされた演算子関数の残りのメソッドを止めているように思えることです。

#include "sample.h" 

#include <iostream> 
#include <vector> 
#include <cstdlib> 

using namespace std; 

sample::sample(vector<double> doubles){} 

sample::sample() {} 

ostream& operator<< (ostream &out, sample &sample) 
{ 
    out << "<" << sample.n << ":"; 
    return out; 
} 

istream& operator>> (istream &in, sample &sample) 
{ 
    char firstChar; 
    in >> firstChar; 

    if(firstChar != '<'){ 
     cout << "You've not entered the data in a valid format,please try again!1 \n"; 
     exit(1); 
    } 

    int n; 
    in >> n; 
    sample.n = n; 

    char nextChar; 
    in >> nextChar; 
    if(nextChar != ':'){ 
     cout << "You've not entered the data in a valid format,please try again!2 \n"; 
     exit(1); 
    } 

    vector<double> doubles; 
    double number; 
    while (in >> number){ 
     doubles.push_back(number); 
     cout << in << " " << number; 
    } 
    in >> lastChar; 

    return in; 
} 

int main(void) 
{ 
    sample s; 
    while (cin >> s){ 
     cout << s << "\n"; 
    } 

    if (cin.bad()) 
     cerr << "\nBad input\n\n"; 

    return 0; 
} 

私の入力は次のようになります。

< 6:10.3 50 69.9>

私は後に、すべてのダブルスを取得しようとしている「:」彼らはint型なら私にできることベクターにいったん「」それが停止しているように見えます。

整数だけを入れると、while(in >> number)がすべての数字を見つけた後も停止しているようですが、これは主な機能のcout<<コマンドが機能していないようです。

どこが間違っていますか?

答えて

1

意味:すべてのストリームは、ブール値(または無効ポインタ)に暗黙的に変換されるようなチェックができるようにしますif (in >> n)を実行して、操作が成功したかどうかを確認します。したがって、最初に、演算子がこれに準拠していることを確認する必要があります(抽出が成功した場合、ストリームが「良い」ことを確認することによって)。あなたはwhile (in >> x) { /*...*/ }のようなループを記述する場合、ループが終了した後

第二には、その後、あなたはすでにあなたの流れはもはや良いではないことを知っています。返す前にclear()に電話する必要があります。

たぶん、このような何か:全体の入力操作が成功した場合、我々は唯一のsampleオブジェクトを変更

std::istream& operator>> (std::istream &in, sample &sample) 
{ 
    char c; 
    int n; 
    double d; 
    std::vector<double> vd; 

    if (!(in >> c)) { return in; }        // input error 
    if (c != '>') { in.setstate(std::ios::bad); return in; } // format error 

    if (!(in >> n)) { return in; }        // input error 

    if (!(in >> c)) { return in; }        // input error 
    if (c != ':') { in.setstate(std::ios::bad); return in; } // format error 

    while (in >> d) 
    { 
    vd.push_back(d); 
    } 

    in.clear(); 

    if (!(in >> c)) { return in; }        // input error 
    if (c != '>') { in.setstate(std::ios::bad); return in; } // format error 

    state.n = n; 
    state.data.swap(vd); 

    return in; 
} 

注意。ベクターに数字を入力するとき、それは拾ったものを参照するには、コードの必死のビットとして、私はそれをここに貼り付けたときのコードのうち、それを削除する必要があることを

+0

Kerrekありがとう、私はより理解しているが、明確な方法が実際に行っていることについて混乱している?私は明確な関数を呼び出すとき、それが私のデータの数字の部分から最後の文字にどのように行くのかを得ようとしていますか? – r0bb077

+0

それはまったく「行きません」。 'clear'はエラーフラグをリセットして、次の抽出操作がまったく実行されるようにします(エラーのあるストリームに対して抽出は実行されません)。 –

+0

すごく、本当にそれを推測しているはずです!もう一度あなたの助けをありがとう! – r0bb077

0
cout << in << " " << number; 

あなたはおそらくあなたが標準ストリームのイディオムに従う必要があり

cout << " " << number; 

か何か

+0

申し訳ありませんアンダース、! – r0bb077

関連する問題