运算符+类的C ++重载

时间:2018-10-25 09:21:08

标签: c++ oop

这是我的老师要分配的任务,我想对operator +进行矩阵重载,然后创建新矩阵并将总和放入此矩阵中,然后打印出来,但是什么也没打印,所以任何人都可以帮助我解决这个问题?

class matrix
{
private:
  int* data;
  int row, col;

public:
  matrix();
  matrix(int r, int c, int num[]);
  friend ostream& operator << (ostream& out, matrix mat1);
  friend istream& operator >> (istream& in, matrix& mat);
  int getrow();
  int getcol();
  int getdata(int i);
  int setrow(int r);
  int setcol(int c);
  int setdata(int num[]);
  matrix operator+ (const matrix& mat2);
};

现在我编写此代码,它不会打印任何内容,有人可以帮助我解决此问题吗? 首先,我对数据进行设置和获取。

matrix::matrix(){
  row=0;
  col=0;
}

matrix::matrix(int r, int c, int num[])
{
  row = r;
  col = c;
  data = new int[r*c];
  for(int i=0; i < (r*c); i++)
    data[i] = num[i];
}

matrix::getrow() { return row; }
matrix::getcol() { return col; }

matrix::setrow(int r) { row=r; }
matrix::setcol(int c) { col=c; }

matrix matrix::operator+ (const matrix& mat2)
{
  matrix mat3;
  for(int i=0; i < mat3.getrow() * mat3.getcol(); i++) {
    mat3.data[i] = data[i] + mat2.data[i];
  }
  return mat3;
}

int main(){
  int num2 [] = {1,2,3,4,5,6,7,8,8};
  int num3 [] = {1,0,0,0,1,0,0,0,1};

  matrix x;

  matrix mat2(3, 3, num2);
  matrix mat3(3, 3, num3);
  matrix mat4;
  mat4 = mat2 + mat3;
  cou << mat4;

  return 0;
}

3 个答案:

答案 0 :(得分:1)

您没有设置mat3的尺寸,因此getrow()getcol()都返回0,并且缓冲区太小,无法容纳放入其中的数据,因此您还会遭受缓冲区溢出的困扰。

添加一个仅接受维度而不初始化值的私有构造函数。

您的下一个问题是您没有复制/移动构造函数/ operator =(),因此对mat3main()的分配没有很好的定义。

答案 1 :(得分:1)

以下是一些建议

1。初始化错误

尝试添加这样的构造函数重载方法:

matrix::matrix(int r, int c)
{
    row = r;
    col = c;
    data = new int[r*c];
    for (int i = 0; i < r*c; i++) {
        data[i] = 0;
    }
}

然后在operator+重载函数中,使用以下方法启动mat3:

matrix mat3(mat2.getrow(), mat2.getcol());


2.overload =运算符至关重要,因为您决定mat4 =

matrix matrix::operator= (const matrix& from_mat)
{
    matrix to_mat(from_mat.getrow(), from_mat.getcol());
    for (int i = 0; i < from_mat.getrow() * from_mat.getcol(); i++) {
        to_mat.data[i] = from_mat.data[i];
    }
    return to_mat;
}


3。在main函数中,只需使用matrix mat4 = mat2 + mat3;

答案 2 :(得分:0)

您的帖子有很多错误。其他人指出了一些问题,这是IMO的完整列表:

  • 您正在询问显示问题,但标题约为operator+,并且您未提供ostream& operator<< ( ostream&, matrix& )的实现。同样没有理由显示矩阵的内容来对其进行修改,因此应该为ostream& operator<< ( ostream&, const matrix& )(这也将消除对按值传递变量的需求)。
  • 您的一些构造函数分配了内存,但是您没有定义析构函数(~matrix())来处理释放,并且没有副本构造函数(matrix( const matrix& ))。了解有关析构函数和内存管理的信息。
  • 您重载了默认构造函数matrix(),但当前无法更新矩阵的大小或内容。如果默认构造函数创建的空矩阵以后无法更改,那又有什么意义呢?在这种情况下,您还应该定义data = nullptr
  • 行数和列数(setrow, setcol)的设置方法的作用尚不清楚;设置大小属性应该会影响内存分配(即data),但目前不会。您还可以将这些方法声明为返回int,但不返回任何内容。您应该删除这两种方法。不需要它们,您的实现目前是错误的。
  • operator+中,首先要检查的是输入的大小与当前矩阵的大小相同。第二件事是正确分配输出(使用matrix( row, col )),这意味着需要附加的构造函数matrix(int r, int c)(如其他答案所建议)。第三是将该方法声明为常量matrix operator+ ( const matrix& other ) const
  • 您的主语录中有一个错字,cou应该是std::cout
  • 最后,如果我写matrix x( -1, -5, NULL );会怎样?