Opened 3 years ago
Closed 3 years ago
#331 closed ожидается проверка (задача сдана)
WW7
Reported by: | morozov.nikita | Owned by: | Святослав Власов |
---|---|---|---|
Component: | WW Matrix | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (5)
comment:1 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
Поскольку enum op -- поле класса, которое изменяется в ходе применения операций +, -, *, то там не поставлен const
comment:3 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
- Присваивающее умножение работает неправильно. Как минимум потому, что размерность матрицы у тебя не меняется (а должна), если подобрать размеры, то твоя прога вообще свалится в сегфолт
init c 2 2 set c 1 0 3 set c 0 1 2 init a 2 1 set a 0 0 1 set a 1 0 2 *= c a print c 4 162 3 6
- Зачем тебе поле класса
Oper op
? Тебе достаточно передаватьOper
аргументом в функциюoper
вместо символа. - Выделяй память
new
вместоmalloc
, мы уже третье занятие пишем на С++, а не на Си :) - Хочется избавиться от копи-пасты в конструкторах и в операторе присваивания. Используй swap trick.
- Копи-пасты между
Matrix::oper
и присваивающими операторами тоже хочется избежать. Советую тебе в неприсваивающих операторах заюзать присваивающие с помощью конструкцииreturn Matrix(*this) += m;
, на занятии я объяснял как это работает.
Пока 7/10
comment:4 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
comment:5 Changed 3 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
- В операторе присваивания у тебя лишнее копирование -- ты принимаешь аргумент по значению, т.е. при вызове
a = b
сначала матрицаb
скопируется вm
, а затемm
скопируется во временный объект в строчкеMatrix(m).swap(*this);
. Одно лишнее копирование. Тебе нужно либо принимать аргумент по ссылке и делать из него временныйMatrix(m)
либо принимать его по значению, тогда копия из него уже не нужна, ты просто пишешьm.swap(*this);
В остальном ок, 9.5/10
Note: See
TracTickets for help on using
tickets.
#include <string.h>
-->#include <cstring>
std::size_t
-->size_t
const
у методовnew
, и мне даже кажется что ты знаешь как это делается :)*this
иm
по значению, т.е. вызовется оператор сравнения, который сравнит матрицы поэлементно. Это избыточно. Нужно сравнивать указатели.+=
и-=
через обычные операторы+
и-
повышает лаконичность, но критически бьет по производительности. При вызове оператора+=
у тебя два раза произойдет выделение памяти под матрицу и копирование значений -- первый раз внутри оператора+
, а другой -- при вызове оператора присваивания в*this = *this + m
. При том, что+=
можно написать вообще без выделения дополнительной памяти.assert
'ы на тех местах, где код может упасть (например, размеры матриц не подходят)В остальном код отличный, приятно читать. Идея с
oper
отличная! Только этот метод нужно сделать приватным, он ведь вспомогательный и мы не хотим, чтобы пользователи юзали его снаружи. Еще я бы тебе советовал не использовать в таких случаях литералы ('+', '-', '*'
, а завестиenum
, в котором перечислить константыPLUS, MINUS, MULT
(тоже в приватной области) и использовать их.