Перегрузка префиксных и постфиксных инкрементов/декрементов в контексте присвоения объектов друг другу
Есть задача - написать класс некоего ящика с длиной, шириной, высоток. также нужно для него выполнить перегрузку операций =, ++ и -- в префиксных и постфиксных формах.
В разных источниках описаны способы перегрузки инкрементов и декрементов как операторных функций-членов примерно так:
// Перегрузка постфиксной операции "++"
Box operator++(int i){
Box temp =*this;
++*this;
return temp;
}
// Перегрузка постфиксной операции "--"
Box operator--(int i){
Box temp =*this;
--*this;
return temp;
}
// Перегрузка префиксной операции "++"
Box &operator++(){
length++;
width++;
height++;
return *this;
}
// Перегрузка префиксной операции "--"
Box &operator--(){
length--;
width--;
height--;
return *this;
}
Эти операции действительно работают в форматах отдельных инструкций:
Box b(3,4,5);
b++; ++b; b--; --b;
Box c;
c = b;
Но две формы инкрменетов/декрементов заведены ради их различий, проявляемых при присвоениях вида:
с = b++;
c = --b;
Здесь возникает проблема:
с = ++b; //работает
с = b++; //не компилируется
и выдает ошибку:
task3.cpp:106:7: error: cannot bind non-const lvalue reference of type ‘Box&’ to an rvalue of type ‘Box’
106 | с = b++;
| ~^~
Подскажите, пожалуйста, как быть?
Ответы (1 шт):
Так, как вы делаете — все верно и компилируется: https://ideone.com/k1IwLt
Поэтому приходится сделать вывод, что у вас, скорее всего, написан оператор присваивания, и написан не совсем корректно. Если судить по сообщению об ошибке, вы передаете ему просто ссылку, не константную... Добавьте квалификатор const в аргументе оператора присваивания.