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: ожидается проверкаожидаются исправления
  1. #include <string.h> --> #include <cstring>
  2. std::size_t --> size_t
  3. Не расставлены const у методов
  4. Лишние пробелы при выводе строк
  5. Есть такое подозрение, что аллокацию матрицы можно сделать за меньшее количество вызовов new, и мне даже кажется что ты знаешь как это делается :)
  6. В операторе присваивания для проверки на самоприсваивание ты сравниваешь *this и m по значению, т.е. вызовется оператор сравнения, который сравнит матрицы поэлементно. Это избыточно. Нужно сравнивать указатели.
  7. Реализация присваивающих операторов += и -= через обычные операторы + и - повышает лаконичность, но критически бьет по производительности. При вызове оператора += у тебя два раза произойдет выделение памяти под матрицу и копирование значений -- первый раз внутри оператора +, а другой -- при вызове оператора присваивания в *this = *this + m. При том, что += можно написать вообще без выделения дополнительной памяти.
  8. Хочется assert'ы на тех местах, где код может упасть (например, размеры матриц не подходят)

В остальном код отличный, приятно читать. Идея с oper отличная! Только этот метод нужно сделать приватным, он ведь вспомогательный и мы не хотим, чтобы пользователи юзали его снаружи. Еще я бы тебе советовал не использовать в таких случаях литералы ('+', '-', '*', а завести enum, в котором перечислить константы PLUS, MINUS, MULT (тоже в приватной области) и использовать их.

comment:2 Changed 3 years ago by morozov.nikita

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

Поскольку enum op -- поле класса, которое изменяется в ходе применения операций +, -, *, то там не поставлен const

comment:3 Changed 3 years ago by Святослав Власов

Type: ожидается проверкаожидаются исправления
  1. Присваивающее умножение работает неправильно. Как минимум потому, что размерность матрицы у тебя не меняется (а должна), если подобрать размеры, то твоя прога вообще свалится в сегфолт
    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
    
  1. Зачем тебе поле класса Oper op? Тебе достаточно передавать Oper аргументом в функцию oper вместо символа.
  2. Выделяй память new вместо malloc, мы уже третье занятие пишем на С++, а не на Си :)
  3. Хочется избавиться от копи-пасты в конструкторах и в операторе присваивания. Используй swap trick.
  4. Копи-пасты между Matrix::oper и присваивающими операторами тоже хочется избежать. Советую тебе в неприсваивающих операторах заюзать присваивающие с помощью конструкции return Matrix(*this) += m;, на занятии я объяснял как это работает.

Пока 7/10

comment:4 Changed 3 years ago by morozov.nikita

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

comment:5 Changed 3 years ago by Святослав Власов

Resolution: задача сдана
Status: assignedclosed
  1. В операторе присваивания у тебя лишнее копирование -- ты принимаешь аргумент по значению, т.е. при вызове 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.