Что не так в функции перегрузки оператора в матричном классе - PullRequest
0 голосов
/ 12 марта 2020

Мне пришлось создать этот класс, чтобы добавить две матрицы, используя перегрузку операторов. Я не хочу использовать указатели в этой проблеме, потому что я еще не до конца их понимаю, я просто пытаюсь научиться перегружать операторы. ошибка, которую это показывает, является ошибкой сегментации (ядро сброшено).

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

class Matrix {
    public : 
        vector<vector<int> >a;
        Matrix(){}
        Matrix operator+( Matrix m ){
            Matrix sum;
            for (int i=0; i<a.size(); i++ ){
                for(int j=0;j<a[i].size(); j++){
                    sum.a[i][j] = a[i][j] + m.a[i][j];
                }
            } 
            return sum;
        }
};
int main () {
   int cases,k;
   cin >> cases;
   for(k=0;k<cases;k++) {
      Matrix x;
      Matrix y;
      Matrix result;
      int n,m,i,j;
      cin >> n >> m;
      for(i=0;i<n;i++) {
         vector<int> b;
         int num;
         for(j=0;j<m;j++) {
            cin >> num;
            b.push_back(num);
         }
         x.a.push_back(b);
      }
      for(i=0;i<n;i++) {
         vector<int> b;
         int num;
         for(j=0;j<m;j++) {
            cin >> num;
            b.push_back(num);
         }
         y.a.push_back(b);
      }
      result = x+y;
      for(i=0;i<n;i++) {
         for(j=0;j<m;j++) {
            cout << result.a[i][j] << " ";
         }
         cout << endl;
      }
   }  
   return 0;
}

Ответы [ 3 ]

1 голос
/ 12 марта 2020

Вы не инициализировали вектор для матрицы, определенной в этой строке:

Matrix sum;

Весь ваш подход может использовать переосмысление. Ответственность за управление внутренним представлением вашей матрицы нарушает принцип инкапсуляции.

Более того, использование vector<vector<int>> неэффективно для не разреженных представлений матрицы. Вам лучше использовать один блок непрерывной памяти.

В любом случае, я рекомендую определить конструктор для Matrix, который принимает размер. Сделайте внутренние данные частными и определите operator[] или аналогичные для доступа к данным

1 голос
/ 12 марта 2020

Внутри оператора вы создали объект типа Matrix с пустым вектором

Matrix sum;

Так что вы не можете использовать оператор индекса в выражении

sum.a[i][j]

Вы можете после создания объекта sum установите соответствующие размеры для вектора.

Например

Matrix sum;
sum.a.assign( a.size(), std::vector<int>( a[0].size() ) );

Обратите внимание на то, что гораздо лучше объявить оператор следующим образом

Matrix operator+( const Matrix &m ) const;

, поскольку ни один из операндов оператора не изменяется в операторе.

1 голос
/ 12 марта 2020

Вектор внутри вашей матрицы sum имеет нулевой размер.
SO, используя operator[], приведет к неопределенному поведению.

        Matrix sum;                                 // sum.a.size() is zero
        for (int i=0; i<a.size(); i++ ){
            for(int j=0;j<a[i].size(); j++){
                sum.a[i][j] = a[i][j] + m.a[i][j];  // broken
            }                                       // sum.a[0][0] does not exist
        } 

Существует несколько решений.
Самое простое - это изменить размер массива так, чтобы он имел необходимое количество строк / столбцов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...