【问题标题】:implementing Matrix class addition operator overloading weird output实现矩阵类加法运算符重载奇怪的输出
【发布时间】:2016-06-20 09:46:53
【问题描述】:

我正在尝试实现一个矩阵类并重载 + 和 = 运算符。 问题是当我添加两个矩阵时,我得到了奇怪的输出,如图所示。 adding two matrices output console

#include <iostream>
#include <iomanip>
using namespace std;


class Matrix
{
   int **p, m, n;
public:
   Matrix(int row, int col)
   {
      m = row;
      n = col;
      p = new int*[m];
      for (int i = 0; i < m; i++)           
        p[i] = new int[n];                      
   }
   Matrix (Matrix & x)
   {
       for(int i = 0; i < m; i++)
      {
        for(int j = 0; j < n; j++)
        {
            p[i][j]=x.p[i][j];
        }
      }
   }
   ~Matrix()
   {
      for (int i = 0; i < m; i++)
        delete [] p[i];
      delete [] p;
   }
   void accept()
   {
      for(int i = 0; i < m; i++)
      {
        for(int j = 0; j < n; j++)
        {
            cin >> p[i][j];
        }
      }
   }
   void display()
   {
      for(int i = 0; i < m; i++)
      {
            for(int j = 0; j < n; j++)
            {
                cout << setw(10)<<left <<p[i][j] <<" | ";
            }
            cout << "\n--------------------------------------"<<endl;
      }
   }
   Matrix& operator +(const Matrix & m2)
   {
      Matrix r(m, n);
      for(int i = 0; i < m; i++)
      {
        for(int j = 0; j < n; j++)
        {
            r.p[i][j] = p[i][j] + m2.p[i][j];
        }
      }
      return r;
   }

   Matrix& operator= (const Matrix & eq)
   {
      for(int i = 0; i < m; i++)
      {
        for(int j = 0; j < n; j++)
        {
            p[i][j]=eq.p[i][j];
        }
      }
      return *this;
   }

   friend Matrix operator * (Matrix, Matrix);
};

Matrix operator* (Matrix a , Matrix b)
{
   Matrix B(1,1);
   if(a.n == b.m)
   {
      Matrix T(a.m, b.n);
      for(int i = 0; i < a.m; i++)
      {
     for(int k = 0; k < b.n; k++)
     {
        T.p[i][k] = 0;
        for(int j = 0; j < a.n; j++)
        {
           T.p[i][k]+= a.p[i][j] * b.p[j][k];
        }
     }
      }
      B = T;
   }
   return B;
}

int main()
{
    cout << "Enter Matrix 1 (3x2):"<<endl;
   Matrix m1(3,2);
   m1.accept();
   m1.display();
   cout << "Enter Matrix 2 (3x2):"<<endl;
   Matrix m2(3,2);
   m2.accept();
   m2.display();
   Matrix m3(3,2);
   m3=m1+m2;
   cout <<endl<< "matrix1 + matix2 is:\n "<<endl;
   m3.display();
}

任何想法如何解决这个问题?我将感谢您在改进它方面的帮助和建议,因为可能会有一些错误。 我使用 CodeBlocks IDE。

【问题讨论】:

  • 1) 您的复制构造函数写入未初始化的指针。 2) operator + 应该返回一个新的矩阵,而不是对当前矩阵的引用。
  • 另外,您的赋值运算符有问题。为什么不直接使用std::vector&lt;std::vector&lt;int&gt;&gt; 而不是所有这些指针?
  • 另一件事是您应该通过 const 引用而不是值来传递您的 Matrix 对象。 friend Matrix operator * (Matrix, Matrix); 应该是 friend Matrix operator * (const Matrix&amp;, const Matrix&amp;);
  • @PaulMcKenzie 非常感谢 :)

标签: c++ matrix operator-overloading


【解决方案1】:

问题是您的operator + 返回一个局部变量Matrix 作为引用;这是未定义的行为。它应该按值返回,而不是按引用返回。

确保您的 Matrix 类有一个接受 const 输入的复制构造函数,即

Matrix (const Matrix & x)

并且它在写入之前初始化数组。将初始化代码(带有分配的两个循环)移动到单独的私有函数中,并从默认构造函数和复制构造函数调用它。

【讨论】:

  • 赋值运算符与复制构造函数存在同样的问题,更糟糕的是,因为会造成内存泄漏。
  • @Abdallah 您还需要修复您的赋值运算符。它比你的复制构造函数更糟糕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2016-02-28
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多