Относительно перегрузки операторов для калькулятора фракций

Часть моего задания - использовать файл моего профессора.cpp. В нем я должен быть в состоянии обработать A = A + B, где A и B - две дроби.

&Fraction Fraction::operator+(Fraction b)
{
  num = (num * b.denom) + (num * denom);/////// 
  denom = (denom * b.denom);
  if ((num * denom) >= 0) 
{ 
  sign_factor = 1;
}
else
{
  sign_factor = -1;
}
num = sign_factor * abs(num);
denom = sign_factor * abs(denom);
num = (num / (static_cast<double>(find_gcd(num, denom))));
denom = (denom / (static_cast<double>(find_gcd(num, denom))));
return this;
}

Мой вопрос заключается в том, как мне вернуть объект A, чтобы main.cpp мог выполнять назначение членов (присваивая результат A + B A). Кроме того, правильно ли, что я ссылался на num внутри этой функции, или я должен использовать a.num. Например, должно ли это быть "a.num = sign_factor * abs(num) или у меня все в порядке?

Большое спасибо!!

1 ответ

Эта подпись не имеет смысла:

&Fraction Fraction::operator+(Fraction b)

Я не знаю цели вашего кода, но в a = a + b может иметь смысл создать временное с результатом и вернуть его

class Fraction {
public:
    Fraction operator+(Fraction b) const // Return a Fraction object
    {
        Fraction result;
        // ... initialize result...
        return result;
    }
};

если num определяется как переменная-член вашего Fraction класс (или один из его подклассов) вы можете безопасно использовать его, как вы или как this->num


Редактировать:

Что касается вашего комментария, я добавляю некоторый код, чтобы объяснить, почему возврат временного объекта может иметь больше смысла. Сравните две версии и решите, какая из них лучше соответствует вашим потребностям. Интуитивно первый является наиболее предпочтительным и логичным выбором.

  • Версия 1: возврат временного (a не изменяется)

    class Fraction {
    public:
    
        Fraction operator+(Fraction& b)
        {
            Fraction result;
            result.num = num + b.num;
    
            return result;
        }
    
        void operator=(Fraction& b)
        {
            num = b.num;
        }
    
        int num;
    };
    
    
    int main()
    {
    
        Fraction a, b, c;
        a.num = 10;
        b.num = 20;
        c.num = 0;
    
        c = a + b;
        // a is now 10
        // b is now 20
        // c is now 30
    }
    
  • Версия 2: возврат ссылки и изменение a

    class Fraction {
    public:
    
        Fraction& operator+(Fraction& b)
        {
            num = num + b.num;
    
            return *this;
        }
    
        void operator=(Fraction& b)
        {
            num = b.num;
        }
    
        int num;
    };
    
    
    int main()
    {
    
        Fraction a, b, c;
        a.num = 10;
        b.num = 20;
        c.num = 0;
    
        c = a + b;
        // a is now 30 <- I believe you don't want this
        // b is now 20
        // c is now 30
    }
    
Другие вопросы по тегам