Я создал класс Fraction, который имеет функции-члены для сложения, вычитания, умножения и деления между двумя объектами Fraction вместе с необходимыми конструкторами по умолчанию и копированием.
Для этой проблемы я должен использовать указатели (не могу использовать векторы!), Потому что объекты Fraction могут быть созданы только по желанию пользователя. Короче говоря, объявление указателя и новая инициализация находятся в разных областях.
Я пытаюсь также перегрузить operator =, operator +, operator-, operator * и operator /, чтобы принять что-то вроде следующего.
Fraction* fr1 = new Fraction(1,2);
Fraction* fr2 = new Fraction(3,4);
Fraction* fr3 = new Fraction();
fr3 = fr1 + fr2;
Моя текущая перегруженная функция operator = member выглядит так:
Fraction* Fraction::operator=(const Fraction*& fr) {num = fr->num;
denom = fr->denom;
return this;
}
Fraction* Fraction::operator+(const Fraction*& fr) const {
int gcd = gcdRecurEuclid(num * fr->denom + denom * fr->num, denom * fr->denom);
Fraction* temp;
temp = new Fraction((num * fr->denom + fr->num * denom) / gcd,
(denom * fr->denom) / gcd);
return temp;
}
Я продолжаю получать ошибку ‘+’: не могу добавить два указателя, что, скорее всего, означает, что мой перегруженный оператор + написан неправильно (и / или мой перегруженный оператор присваивания).
Что мне нужно сделать, чтобы исправить это? Опять же, мой инструктор хочет, чтобы я работал с указателями, и не хочет, чтобы я передавал или возвращал копии чего-либо. Мне либо нужно передать по ссылке (или указатель «похожая вещь»).
Как вы обнаружили, попытка использовать арифметические операторы для указателей приведет к тому, что компилятор попытается выполнить арифметику указателей. Чтобы вызвать свой собственный перегруженный оператор по указателю, вы можете сделать
Fraction *f, *g; // allocated with new
f->operator+(*g); /// Urgh!
или почти так же безобразно
Fraction *f, *g;
(*f) + (*g);
Один из простых способов сделать это немного приятнее — объявить три новые ссылочные переменные, например:
Fraction& f1 = *pfr1;
Fraction& f2 = *pfr2;
Fraction& f3 = *ptr3;
Где pfrN
s являются указателями на ваши дроби. Теперь, если вы используете ссылочные переменные, ваши перегруженные операторы будут вызываться правильно, и вам не нужно вводить все лишние звездочки. Ссылки исчезнут в конце области и, вероятно, не будут использовать дополнительную память в вашей программе. Вам все еще нужно delete
хотя оригинальные указатели!
Когда вы перегружаете бинарный оператор, (например, operator+
) как функция-член, левый аргумент должен быть объектом (а не указателем) класса, для которого вы перегружаете оператор. Если вы хотите сделать это как-то иначе, вам нужно сделать это как свободную функцию, принимая два аргумента, например:
Fraction * operator+(const Fraction * lhs, const Fraction * rhs)
{
...
}
Тем не мение, эта функция подпись не является законной. Вы не можете написать перегрузку оператора, которая принимает только аргументы указателя. По крайней мере, один из аргументов должен быть пользовательским типом (то есть классом, структурой). Это просто правила языка.
Поговорите со своим учителем и получите разъяснения о том, что именно вам нужно делать.