Относительно перегрузки операторов для калькулятора фракций
Часть моего задания - использовать файл моего профессора.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 }