Member 13277493 Ответов: 2

Почему он выдает ошибку о перегруженных операторах?


Напишите дробь класса, которая определяет сложение, вычитание, умножение и
деление дробей путем перегрузки стандартных операторов для этих операций. Писать
функциональный элемент для уменьшения коэффициентов и перегрузки операторов ввода-вывода на вход и
выходные фракции

#include <iostream>

class Fraction
{
    int m_n1, m_n2, m_d1, m_d2, m_n, m_d;
public:
    Fraction():m_n1(0), m_n2(0), m_d1(0), m_d2(0)
    {

    }
    Fraction(int n1, int n2, int d1, int d2):m_n1(n1), m_n2(n2), m_d1(d1), m_d2(d2)
    {
        fractionsAddition(n1, n2, d1, d2);
        reduce(m_n, m_d);
    }
    int gcd(int n, int d);
    int lcm(int d1, int d2);
    void fractionsAddition(int n1, int n2, int d1, int d2);
    void reduce(int n, int d);

    friend std::ostream &operator<<(std::ostream &out, const Fraction &f);
    friend std::istream &operator>>(std::istream &in, const Fraction &f);

};


int Fraction::gcd(int n, int d)
{
    if(d==0)
    {
        return n;
    }
    return gcd(d, n%d);
}

int Fraction::lcm(int d1, int d2)
{
    int max=(d1>d2) ? d1: d2;
    do
    {
        if((max%d1==0) && (max%d2==0))
        {
            return max;
        }

        else
        {
            ++max;
        }
    }
    while(max<d1*d2);

    return d1*d2;
}

void Fraction::reduce(int n, int d)
{
    int g=gcd(m_n, m_d);
    m_n=m_n/g;
    g=g/m_d;
}

void Fraction::fractionsAddition(int n1, int n2, int d1, int d2)
{
    //return (n1*lcm(d1, d2)+n2*lcm(d1, d2))/lcm(d1, d2);
    std::cout<<(n1*lcm(d1, d2)+n2*lcm(d1, d2))<<"/"<<lcm(d1,d2);

}

std::istream &operator>>(std::istream &in, const Fraction &f)
{
    in>>f.m_n1>>f.m_n2>>f.m_d1>>f.m_d2;
    return in;
}

std::ostream &operator<<(std::ostream &out, const Fraction &f)
{
    out<<f.m_n1<<"/"<<f.m_d1<<"+"<<f.m_n2<<"/"<<f.m_d2;
    return out;
}

int main()
{
    Fraction f(1,4,5,6);
    std::cout<<f;

}


Что я уже пробовал:

Я искал в Google, но не смог найти хорошего ответа

Richard MacCutchan

Этот код, похоже, не имеет никакого отношения к описанию вашего задания. Дробь состоит из двух чисел, числителя и знаменателя. Вам поручено написать методы для +, -, *, /. То, что вы написали, не имеет к этому никакого отношения.

2 Ответов

Рейтинг:
2

John R. Shaw

Вы передаете ссылку на постоянную дробь оператору istream, который делает все целочисленные значения постоянными. Нет никакого оператора istream,который принимает "const int" с правой стороны.

Удалите const из объявления и определения оператора istream, как показано ниже.

std::istream &operator>>(std::istream &in, Fraction &f)


Рейтинг:
1

Patrice T

Этот код крайне неэффективен:

int Fraction::lcm(int d1, int d2)
{
    int max=(d1>d2) ? d1: d2;
    do
    {
        if((max%d1==0) && (max%d2==0))
        {
            return max;
        }

        else
        {
            ++max;
        }
    }
    while(max<d1*d2);

    return d1*d2;
}

было бы разумнее использовать формулу
lcm(d1 , d2) = d1 * d2 / gcd(d1 , d2)

[Обновление]
Использование хвостовой рекурсии для GCD также не является эффективным. Цикл является предпочтительным решением, поскольку он требует меньше ресурсов и, следовательно, работает быстрее.
Обратите внимание, что большинство компиляторов преобразуют хвостовую рекурсию в цикл.
Хвостовой звонок - Википедия[^]


Member 13277493

спасибо за хороший совет!

Member 13277493

код не работает, в нем есть некоторые ошибки с перегруженными операторами

Patrice T

Извините, но я не могу вам помочь с операторами.