C++ отсутствует оператор, соответствующий этим операндам
создал свой класс, перегрузил + и <<, с << все хорошо, а плюсом какие-то проблемы. Не могу ничего делать с результатом операции, ни присвоить переменной результат, ни вывести в поток вывода. Если попытаться переменной присвоить результат суммы, напишет: "C++ класс не содержит подходящий конструктор копий", хотя = перегружен тоже и работает вроде бы правильно. Знаний не хватает, чтобы даже понять что не так. Вот код:
#include "cassert"
#include "cmath"
using namespace std;
class fraction {
public:
fraction() {
number = 0;
denominator = 1;
};//конструктор по умолчаию
~fraction() {};//деструктор
fraction(int num, int den) {
bool Denominator_is_zero_or_lower_then_zero = den > 0;
assert(Denominator_is_zero_or_lower_then_zero);
number = num;
denominator = den;
};//конструктор инициализации
fraction(fraction& fract) {
number = fract.number;
denominator = fract.denominator;
};//конструктор копирования
void reduction();
friend ostream& operator<<(ostream& os,fraction& fract);
friend istream& operator>>(istream& is, fraction& fract);
fraction& operator = (fraction const fract);
fraction operator + (fraction const& f2);
private:
int number;
unsigned int denominator;
};
fraction& fraction::operator = (fraction const fract) {
this->number = fract.number;
this->denominator = fract.denominator;
return *this;
}
ostream& operator<<(ostream& os, fraction& fract) {
if (fract.denominator - 1)
os << fract.number << '/' << fract.denominator;
else
os << fract.number;
return os;
}
istream& operator>>(istream& is, fraction& fract) {
int num; long int den;
if (is >> num) {
while (((is.peek() == ' ')|| (is.peek() == '/')) && (is.peek())) {//для возможности считывание через /
if (is.get() == '/' && (is.peek() == ' ' || isdigit(is.peek())))//проверки на / и переход на следующий символ is.get()
break;
}
if (is >> den) {//проверка на отрицательный знаменатель
if (den < 0) {
den = -den; num = -num;
}
fract.number = num;//присваивание
fract.denominator = den;
}
else
assert(!"Invalid input");
}
else
assert(!"Invalid input");
return is;
}
fraction fraction::operator + (fraction const& f2) {
fraction fnew(this->number * f2.denominator + f2.number * this->denominator, this->denominator * f2.denominator);
fnew.reduction();
return fnew;
}
void fraction::reduction() {
unsigned int numroot = abs(sqrt(this->number)) + 1; unsigned int den = this->denominator;
for (int i = 2; (i < numroot)&&(i<den+1); ++i)
if (!(this->number % i)&&!(this->denominator % i)) {
this->number /= i;
this->denominator /= i;
}
}
int main() {
fraction f(9, 2); fraction a(2,2);
cout << a + f;
a = (a+f);
return 0;
}```