Change History (4)

comment:1 Changed 4 years ago by Egor Suvorov

Owner: changed from Дмитрий Свиридкин to zhemchuzhina.elizaveta
Type: ожидается проверкаожидаются исправления

comment:2 Changed 4 years ago by zhemchuzhina.elizaveta

Owner: changed from zhemchuzhina.elizaveta to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка

comment:3 Changed 4 years ago by Дмитрий Свиридкин

Owner: changed from Дмитрий Свиридкин to zhemchuzhina.elizaveta
Type: ожидается проверкаожидаются исправления
(3)/src/main.cpp:65:34: error: catching polymorphic type ‘class MatrixException’ by value [-Werror=catch-value=]
   65 |         } catch (MatrixException e) {

   while (std::cin) {
        try {
            if (get_input(storage))
                return 0;

Получается неявная связь между состоянием потока и функцией get_input. Передавайте поток в функцию явно. И название функции не очень соответсвует тому, что она делает.

Используйте нижнее подчеркивание в конце имен, а не в начале. Рано или поздно вам не повезет и вы перекроете идентификатор из стандартной библиотеки.

В CMakeLists.txt не надо явно указывать флаг -g.
Для сборки в debug при вызове cmake нужно передать -DCMAKE_BUILD_TYPE=Debug

Под gcc санитайзеры не дружат с исключениями. Используйте valgrind для проверки

Сообщения об ошибках вроде как надо было вывести в std::cout, а cerr

class MatrixException : public std::exception {
public:
    MatrixException(const char *msg);

    std::string what_exception();

Почему бы не переопределить виртуальный метод what()?

    int *operator[](std::size_t i);

    const int *operator[](std::size_t i) const;

Так, конечно, можно, но для такого оператора надо бы возвращать обертку над указателем, храняющую еще и длину строки.

int **new_data(std::size_t r, std::size_t c); это должен быть приватный метод

   // оператор присваивания
   Matrix c = m;
   _cols = c._cols;
    _rows = c._rows;
    std::swap(_data, c._data);

Для числа строк и столбцов тоже стоит сделать swap. Вдруг измените деструктор на учитывающий размеры -- и все сломается.
Также присваивание с = m; Лучше заменить явно на конструктор копирования. (Matrix c(m); ). Иначе при смене стандарта на более ранний -- будет бесконечная рекурсия.

    try {
        int *tmp = new int[r * c];
        std::fill(tmp, tmp + r * c, 0);
        int **data = new int *[r];
        for (std::size_t i = 0; i < r; i++)
            data[i] = tmp + i * c;
        return data;
    } catch (std::bad_alloc&) {
        throw MatrixException("Unable to allocate memory.");
    }

Если исключение вылетит от первого new -- все хорошо. А если от второго?


6

comment:4 Changed 4 years ago by Дмитрий Свиридкин

Resolution: задача сдана
Status: assignedclosed
Note: See TracTickets for help on using tickets.