Операторы перегрузки

304
19 февраля 2017, 10:16

Доброго времени суток! Можете понятно объяснить про перегрузку операторов?
Нужно создать класс для представления простой дроби, с чем я справилась, но никак не могу понять, как перегрузить операции +, - и так далее.

class SimpleFraction
{
private:
int a,
    b;
public:
SimpleFraction(int a1, int a2)
{
    setSimpleFraction(a1, a2 );
    if (a2 == 0)
        throw std::runtime_error("zero division error");
}
void setSimpleFraction( int a1, int a2)
{
    a = a1;
    b = a2;
}
void getSimpleFraction()
{
    cout << a << "/"<< b ;
}
 };

Классы только начала изучать, так что могут быть ошибки

Answer 1

У вас тут, как говорится, корова не валялась :)
Вы должны, вообще-то, после каждого действия дробь упрощать - искать НОД числителя и знаменателя и сокращать...

Далее - зачем вам setSimpleFraction? Это можно сделать просто в конструкторе...

Словом, должно быть примерно так:

class SimpleFraction
{
    static int gcd(int m, int n)  // Вычисление НОД
    {
        while(m && n) if (m < n) n %= m; else m %= n;
        return (m == 0) ? n : m;
    }
private:
    int a,
        b;
public:
    SimpleFraction(int a1 = 0, int a2 = 1):a(a1),b(a2)
    {
        if (a2 == 0)
            throw std::runtime_error("zero division error");
    }
    // Нас устраивают копирование и присваивание по умолчанию
    SimpleFraction(const SimpleFraction&) = default;
    SimpleFraction& operator=(const SimpleFraction&) = default;
    // Перегрузка оператора вывода в поток
    friend ostream& operator<<(ostream&out,const SimpleFraction& f)
    {
        return out << f.a << "/" << f.b;
    }
    friend SimpleFraction operator +(const SimpleFraction&x, const SimpleFraction&y)
    {
        int a = x.a*y.b + x.b*y.a; // Числитель
        int b = x.b*y.b;           // Знаменатель
        int n = gcd(a,b);          // НОД
        return SimpleFraction(a/n,b/n);
    }
    SimpleFraction operator -(const SimpleFraction&y) const
    {
        int aa = a*y.b - b*y.a;      // Числитель
        int bb = b*y.b;              // Знаменатель
        int n = gcd(aa,bb);          // НОД
        return SimpleFraction(aa/n,bb/n);
    }

    friend SimpleFraction operator *(const SimpleFraction&x, const SimpleFraction&y)
    {
        int a = x.a*y.a;   // Числитель
        int b = x.b*y.b;   // Знаменатель
        int n = gcd(a,b);  // НОД
        return SimpleFraction(a/n,b/n);
    }
};
int main()
{
    SimpleFraction a(2,3), b(3,5), c(4,9);
    SimpleFraction x = a+b;
    cout << x << endl;
    x = c*b;
    cout << x << endl;
    x = a-c;
    cout << x << endl;
}

перегрузка операторов - это просто функция особого вида, с именем operator @, где @ - тот самый оператор. Может быть членом класса (тогда первый ее неявный параметр - *this, может быть свободной - как в приведенном выше коде.
В вашем случае лучше свободная, и возвращающая новое значение типа SimpleFraction - как я сделал с операторами + и *, но можно и член класса - см. оператор -.

Они просто вычисляют новую дробь, выполняют ее сокращение, и возвращают новое значение.

Так достаточно или что-то надо разъяснить подробнее?

READ ALSO
printf как средство печати переменных в С

printf как средство печати переменных в С

Я не знаю как точно сформулировать то, что я хочу спросить, но выглядит это следующим образом:

500
Передать в метод объект класса T

Передать в метод объект класса T

Всем приветЯ реализую класс списка

289
Qt управление процессом пинга

Qt управление процессом пинга

Доброго времени суток

330