实现Matrix类加法运算符重载奇怪的输出

时间:2016-03-06 22:55:04

标签: c++ matrix operator-overloading

我试图实现矩阵类并重载+和=运算符。 问题是,当我添加两个矩阵时,我会得到奇怪的输出。 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 个答案:

答案 0 :(得分:0)

问题是,您的operator +会将本地变量Matrix作为引用返回;这是未定义的行为。它应该按值返回,而不是通过引用返回。

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

Matrix (const Matrix & x)

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