矩阵类中的运算符重载函数出了什么问题

问题描述 投票:0回答:2

我必须使用运算符重载来创建此类以添加两个矩阵。我不想在这个问题中使用指针,因为我还没有完全理解它们,我只是在尝试学习运算符重载。它显示的错误是分段错误(核心已转储)。

#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;
}
c++ class operator-overloading operator-keyword
2个回答
0
投票

矩阵sum中的向量大小为零。因此,使用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
        } 

有两种解决方案。最简单的方法是调整数组大小,使其具有所需的行数/列数


0
投票

您没有初始化此行定义的矩阵的向量:

Matrix sum;

您的整个方法可能需要重新考虑。让调用者负责管理矩阵的内部表示会破坏封装的原理。

此外,对于非稀疏矩阵表示,使用vector<vector<int>>效率不高。您最好使用一块连续的内存。

无论哪种方式,我都建议为Matrix定义一个接受大小的构造函数。将内部数据设为私有并定义operator[]或类似名称以访问数据

© www.soinside.com 2019 - 2024. All rights reserved.