LINUX.ORG.RU

Правила переопределения операторов

 


0

1

Помогите разобраться с задачей:

Вам дан класс Rational, который представляет рациональное число. В нем определены методы add, sub, mul и div, которые прибавляют к нему число, отнимают число, умножают на число и делят на число соответственно. Кроме того в нем определен метод neg, который меняет знак на противоположный. Вам нужно определить операторы +=, -=, *=, /= для класса Rational, так чтобы они могли принимать в качестве аргументов и объекты типа Rational и целые числа. Кроме того вам необходимо определить операторы унарного минуса и плюса для класса Rational.

struct Rational
{
    Rational(int numerator = 0, int denominator = 1);

    void add(Rational rational);
    void sub(Rational rational);
    void mul(Rational rational);
    void div(Rational rational);

    void neg();
    void inv();
    double to_double() const;

private:
    int numerator_;
    unsigned denominator_;
};

Вот мой неработающий черновик с идеями:

Rational& operator+=(Rational rational)
    {
        return (rational.add(*this));
    };
    Rational& operator-=(Rational rational)
    {
        return (rational.sub(*this));
    };
    Rational& operator*=(Rational rational)
    {
        return (rational.mul(*this));
    };
    Rational& operator/=(Rational rational)
    {
        return (rational.div(*this));
    };

    Rational operator-()
    {
        this->sub();
        return *this;
    };
    Rational operator+()
    {
        this->add();
        return *this;
    };

Самое главное я не пойму как мне получить rvalue для операторов +=, -=, *=, /=?

★★

+=, -=, *=, /=

Это же и есть твои add/sub/mul/div.

Возвращаешь из оператора потом *this, да и всё. Или я не понял, в чем твоя проблема

yoghurt ★★★★★
()

Если я правильно помню, аргумент методов операторов и есть rvalue в твоём случае. Т.е. нужно делать наоборот:

Rational& operator+=(Rational rational)
    {
        return this->add(rational);
    };

Кстати, а почему web-development?

Hater ★★
()
Ответ на: комментарий от yoghurt

Вам нужно определить операторы +=, -=, *=, /= для класса Rational, так чтобы они могли принимать в качестве аргументов и объекты типа Rational и целые числа.

Pirr ★★
() автор топика
Ответ на: комментарий от Pirr

Ну так в чём проблема-то? Вроде же в плюсах так можно:

    Rational& operator+=(Rational rational)
    {
        //...
    };
    Rational& operator+=(int val)
    {
        //...
    };
Hater ★★
()
Ответ на: комментарий от Hater

Такое решение не подходит, вот на что ругается:

Compilation error main.cpp: In member function ‘Rational& Rational::operator+=(Rational)’: main.cpp:16:34: error: invalid initialization of non-const reference of type ‘Rational&’ from an rvalue of type ‘void’ main.cpp......

Pirr ★★
() автор топика
Ответ на: комментарий от Pirr

Ну нагуглил бы уже давно правильный синтаксис) Я лет 6 плюсы в руки не брал. Отсюда:

class X {
 public:
  X& operator+=(const X& rhs) // compound assignment (does not need to be a member,
  {                           // but often is, to modify the private members)
    /* addition of rhs to *this takes place here */
    return *this; // return the result by reference
  }
}
Hater ★★
()
Ответ на: комментарий от Hater

Я нашел практически готовое решение http://pages.cs.wisc.edu/~colbster/cs302/examples/rational.cpp

Но все равно, не пойму как это работает?

const Rational & Rational::operator +=  (const Rational & other) {
    return (*this = Add (other));
}
Оператора '=' у меня нет, а вот так (*this->add(other)) оно не работает.

Pirr ★★
() автор топика

вспоминается копия гравюры на обложке к одному из изданий CLR(без S)

чему учать такие задания?

в лекциях вокруг STL Спетанов(уже святой) напоминает что ООП не лучшим образом подходит для бинарных операций.

и вот обучая С++ дают задания которые лучше через обобщённое , но нет крутять обьекты.

ps. делай через обобщёные функции , а не через методы одного из аргументов.

тем более теория действительных хорошо (больше 2000 лет) проработана поэтому у тя нет необходимости заморачиваться с ссылочностью а делать их всегда по значению(ибо действительные идентичны когда эквивалентны).

qulinxao ★★☆
()
Ответ на: комментарий от Pirr

'=' по дефалту компилятор даёт если нет специализации.

вообще посмотри про конструкторы/деструкторы/копирование обьекта - без этого будешь страдать.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

бред

просто ТС не асилил простейших вещей и ему следовало бы поучиться на программиста перед тем, как программизмом заниматься

unt1tled ★★★★
()
Ответ на: комментарий от qulinxao

Да, страдаю и страдания мои велики. Если все таки закончу онлайн курс по С++, никогда... НИКОГДА не буду на нем программировать.

Pirr ★★
() автор топика
Ответ на: комментарий от unt1tled

точно , эт же не stl

эт же tr1(2?) и просто <complex>

как пример реализации работ с парами (рациональные в одном из прочтении это соизмеримые - там ещё иногда для удобства общие множители сокращают)

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Всем спасибо! Задание решил, вот ответ если кому интересно:

Rational& operator+=(Rational rhs)
    {
        numerator_ = numerator_ * rhs.denominator_ + rhs.numerator_ * denominator_;
        denominator_ = denominator_ * rhs.denominator_;
        return *this;
    };
    Rational& operator-=(Rational rhs)
    {
        numerator_ = numerator_ * rhs.denominator_ - rhs.numerator_ * denominator_;
        denominator_ = denominator_ * rhs.denominator_;
        return *this;
    };
    Rational& operator*=(Rational rhs)
    {
        int newNumer = numerator_ * rhs.numerator_;
        int newDenom = denominator_ * rhs.denominator_;

        numerator_ = newNumer;
        denominator_ = newDenom;
        return *this;
    };
    Rational& operator/=(Rational rhs)
    {
        int newNumer = numerator_ * rhs.denominator_;
        int newDenom = denominator_ * rhs.numerator_;
        numerator_ = newNumer;
        denominator_ = newDenom;
        return *this;
    };

    Rational operator-()
    {
        return Rational(-numerator_, denominator_);
    };
    Rational operator+()
    {
        return *this;
    };

Но теперь предстоит решить еще пару задач на эту тему.

Pirr ★★
() автор топика
Ответ на: комментарий от Pirr

прикрути сокращение общих множителей, а иначе разрядности будет совсем не хватат

qulinxao ★★☆
()
Ответ на: комментарий от Pirr

т.е у тя даже при делении числитель и знаменатель пухнут.

это успех.

qulinxao ★★☆
()

Очень странная тема...

asaw ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.