Перегрузка оператора + для сложения 2 массивов

304
21 февраля 2017, 17:58

Доброго времени суток! Нужно перегрузить оператор + для сложение двух двумерных массивов. Пыталась перегрузить так, но это вызывает исключение

friend Matrix operator +(const Matrix &right, const Matrix &left)
{
    Matrix result (right.n,right.m);
    for (int i = 0; i < right.n; i++)
    {
        for (int j = 0; j < right.m; j++)
        {
            result.mas[i][j] += right.mas[i][j]+ left.mas[i][j];
        }
    }
    return result;
}

Как исправить?

Обновление

Пока что плохо разбираюсь с конструкторами, но вот, что вышло.

Matrix()
{
    n = n;
    m =m;
    mas = new int*[n];
    for (int i = 0; i < n; i++)
    {
        mas[i] = new int[m];
    }
} 

Это конструктор по умолчанию, я надеюсь.

И вот еще

Matrix (int n, int m) : n(n), m(m)
{
    mas = new int*[n];
    for (int i = 0; i < n; i++)
    {
        mas[i] = new int[m];
    }
}
Answer 1

По-хорошему, в конструкторе нужно инициализировать массив. Вы выделили память, теперь там - в массиве - совершенно случайные значения... Это - для конструктора Matrix (int n, int m). В конструкторе Matrix() всё вообще весело - какие значения вы присваиваете n и m? Да те же случайные, что в них и были.

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

Ну и обязательно нужно проверять равенство размеров суммируемых массивов! Если не генерацией исключения - то хотя бы assert...

Итак, выбросьте конструктор по умолчанию, сделайте один вот такой:

Matrix(int n = 1, int m = 1, int value = 0): n(n), m(m)
{
    mas = new int*[n];
    for (int i = 0; i < n; i++)
    {
        mas[i] = new int[m];
        for(int j = 0; j < m; ++j) mas[i][j] = value;
    }
}

B будет он у вас и швец, и жнец (и обычный конструктор, и по умолчанию - создавать массив 1x1), и даже на дуде игрец - заполнять массив значениями по умолчанию...

Ну, а в операторе + напишите не

result.mas[i][j] += right.mas[i][j]+ left.mas[i][j];

а

result.mas[i][j] = right.mas[i][j]+ left.mas[i][j];

и добавьте проверку хотя бы assert(left.n == right.n && left.m == right.m); или

if (left.n != right.n || left.m != right.m)
    throw std::exception("Matrix sizes not matched in operator+()");

Ну, и не забудьте, как вам уже писали, копирующий конструктор. Да и оператор присваивания не помешает. О них уже рассказано здесь: Правильно ли заданы конструктор копирования и оператор присваивания? Как улучшить?

READ ALSO
Интерполяция на сетку Вороного

Интерполяция на сетку Вороного

Подскажите библиотеку на C++ в которой реализован метод интерполяции с регулярной сетки на сетку ВороногоКак я понял нужно искать все пересечения...

235
Выдача экранной формы на странице ввода пароля Win

Выдача экранной формы на странице ввода пароля Win

Как написать программу, которая бы могла на странице входа пользователя в систему выдать какую-нибудь экранную формуТипа Hello World

255
Error Code: 1449 The user specified as a definer (&#39;&#39;bs@&#39;%&#39;) does not exist

Error Code: 1449 The user specified as a definer (''bs@'%') does not exist

Хочу делат апдейт на таблице видает такую ошибку

320
Создание дампа mysql

Создание дампа mysql

Работаю на денвере через CMD (Денвер потому что весит мало), есть несколько вопросов по Mysql

243