为什么我会出现分段错误/如何重载运算符?

时间:2015-11-24 05:20:30

标签: c++ vector segmentation-fault

这是HackerRank(简介C ++)的一个问题。我给了main()。我正在尝试为一个由向量​​>表示的矩阵编写一个类。我需要重载+以使其添加我的矩阵对象。测试将输入四行:第一行将显示预期的测试用例数,第二行将指定维度(第一行是行,第二行是列),第三行将给出第一个矩阵(前m个数字,用空格分隔) ,将进入第一行......然后接下来的m个数字将进入第二行......等等,第四行将给出第二个矩阵。

当我运行第一个测试用例时,我遇到了分段错误。当我在运算符定义中消除了int声明和for循环,并且只是让它返回matrixprime时,我显然得到了矩阵加法的错误答案,但它至少输出没有错误。 之前,为了访问矩阵的元素,我使用了" matrix.a.at(i).at(j)"而不是" matrix.a [i] [j]"并且向量得到了out_of_range错误。在我的操作员定义中,我觉得这些问题与我的临时矩阵对象(如果这是正确的调用它)有某种关系,但不能完全理解出错的地方。任何帮助将不胜感激!

shuf

2 个答案:

答案 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];