2012-12-12 6 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<< 괜찮 (당신은 비록 한 줄에 쓸 수 있지만, 여기에 문제가되지 않습니다) :

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++ 프로그래머가 기대할 것입니다).

코드에 대한 다른 의견 : 은 생성자와 삽입 연산자를 작성한 방법이 이며 제안 된 대안보다 바람직합니다.

관련 문제