3 / 3 / 0
Регистрация: 18.11.2015
Сообщений: 77
|
|||||||||||
1 | |||||||||||
Оператор присваивания26.02.2018, 19:38. Просмотров 1047. Ответов 10
Метки нет Все метки)
(
Здравствуйте!
Есть класс, в котором перегружены операции сложения и присваивания:
Если не передавать объект по ссылке в функцию присваивания, то всё будет хорошо. Но объясните, пожалуйста, почему возникает проблема при передаче по ссылке: вроде бы оператор присваивания возвращает объект, равный a+b, а затем этот объект должен передаться по ссылке при присваивании. Где я не прав?
0
|
|
26.02.2018, 19:38 | |
Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * Оператор присваивания в c++ оператор присваивания оператор присваивания
__________________
10
Помогаю в написании студенческих работ здесь. Записывайтесь на профессиональные курсы C++ разработчиков |
|
"C with Classes"
|
|
26.02.2018, 19:42 | 2 |
DmmiTrY, по ходу у тебя в реализации операторов ошибка. скинь ее тоже.
Добавлено через 1 минуту DmmiTrY, operator = обычно ссылку возвращает так как может стоять в цепочке операторов.
0
|
3 / 3 / 0
Регистрация: 18.11.2015
Сообщений: 77
|
|||||||||||
26.02.2018, 20:18 [ТС] | 3 | ||||||||||
_stanislav,
0
|
С чаем беда...
![]() ![]() 8525 / 4243 / 1173
Регистрация: 18.10.2014
Сообщений: 9,212
|
||||||
26.02.2018, 20:45 | 5 | |||||
Верно. Но ваш оператор присваивания возвращает временный объект, равный a+b. Ко временному объекту нельзя привязать неконстантную lvalue-ссылку
Matrix& . Отсюда и ошибка компиляции. Без правильного использования const эту функциональность реализовать не получится. Должно быть
+ лучше реализовывать самостоятельной функцией, а не методом класса.
1
|
301 / 213 / 74
Регистрация: 23.05.2011
Сообщений: 970
|
||||||
26.02.2018, 20:53 | 6 | |||||
Проблема в том, что изменяемыми ссылками
T& могут быть только ссылки на lvalue (значения, которые могут "стоять слева" при присваивании).То есть, это должны быть изменяемые переменные, например. А в выражении a+b у тебя получается вычисленное значение, то есть, rvalue. То же самое с любыми вызовами конструкторов или функций, возвращающих объекты.У тебя должен быть оператор вида: Matrix& operator = (const Matrix&); const T& , то есть, неизменяемая ссылка.Вот моя тема, которую я создал буквально вчера, где разжёвывается часть. Особенности перегрузки некоторых операторов И да, если следовать советам оттуда, у тебя должны быть вообще операторы вида:
Matrix()=a+b;
1
|
С чаем беда...
![]() ![]() 8525 / 4243 / 1173
Регистрация: 18.10.2014
Сообщений: 9,212
|
|
27.02.2018, 09:26 | 8 |
Да, оговорился и он и я. Имелось в виду: оператор сложения возвращает временный объект, равный a+b.
0
|
С чаем беда...
![]() ![]() 8525 / 4243 / 1173
Регистрация: 18.10.2014
Сообщений: 9,212
|
|
27.02.2018, 16:25 | 10 |
Не понимаю. Наоборот, именно потому, что объект возвращается по значению (т.е. возвращается временный объект), и получилась ошибка. В исходном варианте кода временный объект не может быть правой частью оператора присваивания.
0
|
3 / 3 / 0
Регистрация: 18.11.2015
Сообщений: 77
|
||||||
27.02.2018, 16:51 [ТС] | 11 | |||||
_stanislav, я действительно описался с оператором присваивания. Такое описание:
New man, и TheCalligrapher, спасибо за ответ! Я думал, что const просто защищает объект от изменений. А здесь получается, что const нужен, только чтобы сообщить компилятору, что можно передавать в функцию временные объекты по ссылке. Так получается?
0
|
27.02.2018, 16:51 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь. Оператор присваивания. Оператор присваивания
Оператор присваивания Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |