这是HackerRank(简介C ++)的一个问题。我给了main()。我正在尝试为一个由向量>表示的矩阵编写一个类。我需要重载+以使其添加我的矩阵对象。测试将输入四行:第一行将显示预期的测试用例数,第二行将指定维度(第一行是行,第二行是列),第三行将给出第一个矩阵(前m个数字,用空格分隔) ,将进入第一行......然后接下来的m个数字将进入第二行......等等,第四行将给出第二个矩阵。
当我运行第一个测试用例时,我遇到了分段错误。当我在运算符定义中消除了int声明和for循环,并且只是让它返回matrixprime时,我显然得到了矩阵加法的错误答案,但它至少输出没有错误。 之前,为了访问矩阵的元素,我使用了" matrix.a.at(i).at(j)"而不是" matrix.a [i] [j]"并且向量得到了out_of_range错误。在我的操作员定义中,我觉得这些问题与我的临时矩阵对象(如果这是正确的调用它)有某种关系,但不能完全理解出错的地方。任何帮助将不胜感激!
shuf
答案 0 :(得分:1)
使用时:
Matrix matrix;
编译器使用编译器创建的默认构造函数。它使用默认构造函数初始化成员a
,这是一个空向量。
您必须先创建一个包含正确数量元素的向量,然后才能使用at()
或oprator[]
。
使用空矢量,行
int m = matrix.a[0].size();
导致未定义的行为。
您需要以下内容:
Matrix Matrix::operator+ (const Matrix& matrixprime)
{
// Initialize the matrix to be returned to be the same
// as the LHS of the operator.
Matrix matrix;
matrix.a = this->a;
// Now increment the elements of the matrix to be returned
// by the elements of the RHS of the operator.
int n = matrix.a.size();
for (int i=0; i<n; i++)
{
int m = matrix.a[i].size();
for (int j=0; j<m; j++)
{
matrix.a[i][j] += matrixprime.a[i][j];
}
}
return matrix;
}
答案 1 :(得分:0)
错误是在你的plus运算符overloaping函数上matrix
var未初始化,另一方面你应该使用这样的matrix.a[i][j] = this->a[i][j] + matrixprime.a[i][j];