2015-02-24 82 views
0

我有一個分數類,允許以c/d格式輸入分數。 我可以輸出和輸入分數就好了,但是當我用我的自定義函數修改它們時,如下所示,它什麼都不做。在C++中雙重載入istream和ostream運算符

我有以下重載>>和< <運算符:

ostream& operator<<(ostream &out, const Fraction &f) 
{ 
    char x = '/'; 
    out << f.num; 
    out << x; 
    out << f.den; 
    return out; 
} 

istream& operator>>(istream &in, Fraction &r) 
{ 
    //in >> r; 
    int whole = 0, num, den = 1; 
    char next; 
    in >> num; 
    next = in.peek(); 
    if(next == '+'){ 
     in.get(); 
     whole = num; 
     in >> num; 
     next = in.peek(); 
    } 
    if(next == '/'){ 
     in.get(); 
     in >> den; 
    } 
    if(whole != 0){ 
     num += (whole * den); 
    } 
    if(den == 0){ 
     den = 1; 
    } 
    r.num = num; 
    r.den = den; 

    return in; 
} 

此外,我有一個函數,使兩種級分以使它們具有相同的公分母:

void setEqualDen(Fraction a, Fraction b){ 
    int tempa = a.den; 
    int tempb = b.den; 
    a.den *= tempb; 
    b.den *= tempa; 
    a.num *= tempb; 
    b.num *= tempa; 
} 

然後我嘗試輸出結果如下:

setEqualDen(Fa, Fb); 
    cout << "The fractions are " << Fa << " , " << Fb << 
      endl; 

這不起作用。是否有必要的步驟,如雙重重載C++中的<和>>操作符,還是我的語法只是缺少一些東西?

+2

你是什麼意思*不起作用*?如果你的意思是結果不符合你的期望,那麼這是因爲'setEqualDen'複製了它的參數,而不是通過引用來引用它們。如果這不是問題,那麼請解釋* double overload *的含義,併發布錯誤消息,預期輸出等。 – Praetorian 2015-02-24 00:04:46

+0

您的輸入函數失敗,並顯示「1 +/25」。 – 2015-02-24 00:12:09

+0

而不是假設空白的數量,你應該跳過它。 – 2015-02-24 00:13:47

回答

2

您希望&在函數定義中,因爲您需要通過引用來傳遞,因爲您正在修改「分數」。

void setEqualDen(Fraction &a, Fraction &b){ 
    int tempa = a.den; 
    int tempb = b.den; 
    a.den *= tempb; 
    b.den *= tempa; 
    a.num *= tempb; 
    b.num *= tempa; 
} 
+0

這可能會解決OP的問題,但沒有理由讓'setEqualDen'成爲一個成員函數,因爲它沒有訪問它被調用的實例。 – Praetorian 2015-02-24 00:12:12

+0

這是給我一個錯誤,當試圖調用函數... – JCoder 2015-02-24 00:16:36

+0

@Praetorian - 是的,這是一個很好的觀點,這是沒有必要的。這裏的偏好是什麼,因爲函數只對這個特定類有效?我會說讓它成爲一個成員,這樣你就可以移動這個類,而不用擔心在另一個程序中重新創建函數。 – TriHard8 2015-02-24 00:17:25

0

您需要檢查輸入錯誤並跳過空格。我建議使用臨時的第一位數字,因爲它可能是整數或分子。在檢測到「/」之後需要進行區分。

std::istream& operator>>(std::istream& inp, Fraction& f) 
{ 
    int temp = 0; 
    f.num = 0; 
    f.den = 1; 
    inp >> temp; // Could be whole number or numerator. 
    if (inp) 
    { 
    int whole = temp; 
    int numerator = 0; 
    inp >> numerator; 
    if (!inp) 
    { 
     // Let's assume that the input failed because of the '/' symbol. 
     numerator = temp; 
     whole = 0; 
     inp.clear(); 
    } 
    else 
    { 
     inp.ignore(1000, '/'); // Skip over the '/' 
    } 
    int denominator = 1; 
    inp >> denominator; 
    if (denominator == 0) denominator = 1; 
    numerator += whole * denominator; 
    f.num = numerator; 
    f.den = denominator; 
    } 
    return inp; 
}