c++ - 矩阵类中的运算符重载函数有什么问题
问题描述
我必须创建这个类来添加两个矩阵,使用运算符重载。我不想在这个问题中使用指针,因为我还没有完全理解它们,我只是想学习运算符重载。它显示的错误是分段错误(核心转储)。
#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;
}
解决方案
矩阵内的向量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
}
有几个解决方案。
最简单的方法是调整数组的大小,使其具有所需的行数/列数
推荐阅读
- c - Librsync:Win10和Win8/Win7不同的结果
- android - 使用 parcelable 在 Intent 中传递数组
- sql - 选择顶部重复记录
- python - Python:多个try / except块,如果两个异常都失败则打印错误?
- html - 根据条件禁用输入
- r - 在 R 中每个月只保留一个 ID #
- python - 使用 python 从网站获取特定数据
- c# - 检查 Dictionary<> 的最快方法等于另一个
- r - 如何在r中的矩阵中将十六进制转换为二进制?
- json - 如何解析或反序列化作为 Automation Anywhere 中 REST API 调用响应的 JSON 字符串?