Opened 4 years ago

Closed 4 years ago

#190 closed ожидается проверка (задача сдана)

Домашнее задание №1

Reported by: Климов Егор Owned by: rutsky,grabovoy.philipp
Priority: проверка Milestone: ha1-milestone2
Component: HA#1 matrices Version: 1.0
Keywords: Cc:

Description


Change History (7)

comment:1 Changed 4 years ago by Vladimir Rutsky

Milestone: ha1-milestone1ha1-milestone2
Type: ожидается проверкаожидаются исправления

Замечания:

  1. Почему вы возвращаете из add() и mult() константную Matrix?

comment:2 in reply to:  1 Changed 4 years ago by Климов Егор

Replying to rutsky:

Замечания:

  1. Почему вы возвращаете из add() и mult() константную Matrix?

Здравствуйте!

Чтобы избежать возможности использования конструкций типа:

Matrix a, b, c, d;
...
a.add(b) = c;
a.mult(b) = d;
...

Вдруг кто-нибудь бы хотел использовать сумму/произведение в качестве промежуточного значения и тогда подобные конструкции могли бы что-нибудь поломать, но как-то это похоже на что-то почти невозможное.

comment:3 Changed 4 years ago by Климов Егор

Придумал пример: если бы потом я перегрузил оператор ==, то сложно было бы отследить такую ошибку:

Matrix a, b, c, d;
...
if(a.mult(b) = c.mult(d)) 
{
  ...
}

А в случае const, компилятору это должно не понравиться.
Но в этой задаче даже конструктор копирования не понадобился, поэтому, может, я зря это сделал.

comment:4 Changed 4 years ago by Климов Егор

Type: ожидаются исправленияожидается проверка

comment:5 Changed 4 years ago by Климов Егор

Внёс изменения:

  1. Сделал возвращаемые значения в add() и mult() не константными
  2. Заменил инициализацию в теле конструктора на инициализацию в списке инициализации
  3. Добавил в умножении временную переменную для суммирования, чтобы лишний раз не обращаться к матрице.

Изменение конструктора и добавление временной переменной сделал на всякий случай после просмотра чужих тикетов, надеюсь так можно делать :)

Просматривая тикеты увидел, что Вы уже кому-то писали про const и привели пример с ссылкой на результат действия, не уверен, что правильно понял пример, но видимо если оставить const, то мы не сможем напрямую создавать ссылки на объекты-результаты действия и придется делать ещё лишнюю работу, чтобы создать копию этого объекта, но уже изменяемую и потом на неё сослаться? Корректно ли делать подобные ссылки?

Last edited 4 years ago by Климов Егор (previous) (diff)

comment:6 Changed 4 years ago by Vladimir Rutsky

Отсутствие const не должно ничего ломать, т.е. операции вроде a.add(b) = c; хоть и не осмысленны, но не должны приводить к некорректному поведению или утечкам памяти.
Делая временный объект (результат умножения матриц, prvalue) константным, вы ограничиваете возможности применения этого объекта: его нельзя будет сохранить по неконстантной ссылке (например, если пользователь захочет гарантированно избежать копирования), его нельзя будет использовать в качестве аргумента в move-конструкторах и функциях, принимающих неконстантную rvalue-ссылку.

comment:7 Changed 4 years ago by Vladimir Rutsky

Resolution: задача сдана
Status: newclosed

Решение зачтено.

Note: See TracTickets for help on using tickets.