我正在尝试实现矩阵类并重载+和=运算符。
问题是当我添加两个矩阵时,我得到了奇怪的输出,如图所示。
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。

最佳答案

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

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

Matrix (const Matrix & x)

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

07-28 01:32
查看更多