简体   繁体   中英

implementing Matrix class addition operator overloading weird output

I'm trying to implement a matrix class and overloading the + and = operators. The problem is I'm getting weird output when I add two matrices as in this picture. 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();
}

Any ideas how to fix that? I would be grateful for your help and advices with improving it because probably there will be some mistakes. I use CodeBlocks IDE.

The problem is that your operator + returns a local variable Matrix as a reference ; this is undefined behavior . It should be returned by value, not by reference.

Make sure that your Matrix class has a copy constructor that takes a const input, ie

Matrix (const Matrix & x)

and that it initializes the array before writing into it. Move the initialization code (the two loops with allocation) into a separate private function, and call it from the default constructor and from the copy constructor.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM