2012-12-12 70 views
1

我想知道下面的代碼是否打算對有理數進行操作實際上已經重載了賦值操作和流插入操作符< <來打印對象。我對C++不太好,所以這對我來說是新的,但從我能告訴的我認爲它已經做到了。重載賦值操作/流

/* 
* 
* C++ version 
* 
*/ 

/* rational.h */ 

#ifndef RATIONAL_H 
#define RATIONAL_H 

#include <iostream> 

using std::ostream; 

struct rational { 

    rational(int = 0, int = 1); 

    rational operator+(const rational &) const; 
    rational operator-(const rational &) const; 
    rational operator*(const rational &) const; 
    rational operator/(const rational &) const; 

    rational operator+(int) const; 
    rational operator-(int) const; 
    rational operator*(int) const; 
    rational operator/(int) const; 

    friend rational operator+(int, const rational &); 
    friend rational operator-(int, const rational &); 
    friend rational operator*(int, const rational &); 
    friend rational operator/(int, const rational &); 

    friend ostream &operator<<(ostream &, const rational &); 

private: 

    int den; 
    int num; 
}; 

#endif /* RATIONAL_H */ 

/* rational.cc */ 

#include <iostream> 
#include "rational.h" 

rational::rational(int num, int den) : num(num), den(den) {} 

rational rational::operator+(const rational &o) const { 

    return rational(num * o.den + o.num * den, den * o.den); 
} 

rational rational::operator+(int n) const { 

    return rational(num + n * den, den); 
} 

rational rational::operator-(const rational &o) const { 

    return rational(num * o.den - o.num * den, den * o.den); 
} 

rational rational::operator-(int n) const { 

    return rational(num - n * den, den); 
} 

rational rational::operator*(const rational &o) const { 

    return rational(num * o.num, den * o.den); 
} 

rational rational::operator*(int n) const { 

    return rational(num * n, den); 
} 

rational rational::operator/(const rational &o) const { 

    return rational(num * o.den, den * o.num); 
} 

rational rational::operator/(int n) const { 

    return rational(num, den * n); 
} 

rational operator+(int n, const rational &o) { 

    return o + n; 
} 

rational operator-(int n, const rational &o) { 

    return rational(n) - o; 
} 

rational operator*(int n, const rational &o) { 

    return o * n; 
} 

rational operator/(int n, const rational &o) { 

    return rational(n)/o; 
} 

ostream &operator<<(ostream &out, const rational &o) { 

    out << '(' << o.num << "/" << o.den << ')'; 
    return out; 
} 

/* main.cc */ 

#include <iostream> 
#include "rational.h" 

using std::cout; 
using std::endl; 

int main(void) { 

    rational a(1, 2); 
    rational b(2, 3); 

    int i = 5; 

    cout << a << " + " << b << " = " << a + b << endl; 
    cout << a << " - " << b << " = " << a - b << endl; 
    cout << a << " * " << b << " = " << a * b << endl; 
    cout << a << "/" << b << " = " << a/b << endl; 

    cout << a << " + " << i << " = " << a + i << endl; 
    cout << a << " - " << i << " = " << a - i << endl; 
    cout << a << " * " << i << " = " << a * i << endl; 
    cout << a << "/" << i << " = " << a/i << endl; 

    cout << i << " + " << a << " = " << i + a << endl; 
    cout << i << " - " << a << " = " << i - a << endl; 
    cout << i << " * " << a << " = " << i * a << endl; 
    cout << i << "/" << a << " = " << i/a << endl; 

    return 0; 
} 

回答

2

operator<<是OK(你可以在一行寫,雖然,但沒關係這裏):

ostream &operator<<(ostream &out, const rational &o) { 
    return out << '(' << o.num << "/" << o.den << ')'; 
} 

但是,你有沒有定義賦值運算符呢!

rational & rational::operator=(rational const &rhs) { 
    den = rhs.den; 
    num = rhs.num; 
    return *this; 
} 
+0

我只需要一個函數(您提供的函數)? – user1880760

+0

你可以使用'operator ='我給你,是的。 alestanis的版本現在也適用,但'this->'是可選的(他必須來自Java世界;)) – phaazon

+0

和構造函數也沒關係吧? – user1880760

2

簡短的回答:是它爲<<和算術運算。 它不適用於分配。

例如,這是<<超載:

ostream &operator<<(ostream &out, const rational &o) { 
    out << '(' << o.num << "/" << o.den << ')'; 
    return out; 
} 

超負荷assignment operator,你應該寫一個函數

rational& rational::operator=(const rational &o) { 
    this->den = o.den; 
    this->num = o.num; 
    return *this; 
} 
+0

您的賦值運算符不能用於賦值鏈或循環/ if語句中。另外,你不能將它聲明爲const,因爲它會改變它。 – phaazon

+0

@skp你說得對,我編輯 – alestanis

+0

賦值運算符是完全不必要的和多餘的。 –

0

插入和分配都很好。賦值運算符 (和複製構造函數)由編譯器提供,在這種情況下 罰款。如果由於某種原因,你確實想提供 一個賦值操作符(或者你需要某個其他類), ,你幾乎可以肯定需要提供一個拷貝構造函數,並且大多數情況下都是析構函數。但這不是 ;編譯器生成的版本都沒有問題(我認爲C++程序員最期待的東西)。

至於您的代碼的其他意見:你 寫的構造和插入運營商的方法就是 罰款,最好的建議的替代。