Search code examples
c++classmatrixoperator-overloadingassignment-operator

c++ matrix class: overloading assignment operator


I'm having some trouble implementing an assignment operator for a matrix class. It seems that the compiler doesn't want to recognize my overloaded assignment operator (I think?) and I'm not sure why. I know there are some internet articles on the various issues with implementing matrix classes in c++ (which have helped me get this far) but this time I can't seem to parallel my current predicament with any other help already out there. Anyway, I would greatly appreciate it if someone could help explain what I'm doing wrong. Thanks!

Here are my error messages:

In file included from Matrix.cpp:10:
./Matrix.h:20:25: error: no function named 'operator=' with type 'Matrix &(const Matrix &)'
      was found in the specified scope
        friend Matrix& Matrix::operator=(const Matrix& m);
                               ^
Matrix.cpp:79:17: error: definition of implicitly declared copy assignment operator
Matrix& Matrix::operator=(const Matrix& m){ //m1 = m2
                ^
Matrix.cpp:89:13: error: expression is not assignable
                        &p[x][y] = m.Element(x,y);
                        ~~~~~~~~ ^
3 errors generated.

Here is my assignment operator code in my .cpp file:

  Matrix& Matrix::operator=(const Matrix& m){ //m1 = m2
      if (&m == this){
          return *this;
      }   
      else if((Matrix::GetSizeX() != m.GetSizeX()) || (Matrix::GetSizeY()) != m.GetSizeY()){
          throw "Assignment Error: Matrices must have the same dimensions.";
      }   
      for (int x = 0; x < m.GetSizeX(); x++)
      {
          for (int y = 0; y < m.GetSizeY(); y++){
              &p[x][y] = m.Element(x,y);
          }   
      }   
      return *this;

here is my matrix header file:

   class Matrix
   {
    public:
      Matrix(int sizeX, int sizeY);
      Matrix(const Matrix &m);
      ~Matrix();
      int GetSizeX() const { return dx; }
      int GetSizeY() const { return dy; }
      long &Element(int x, int y) const ;       // return reference to an element
      void Print() const;

      friend std::ostream &operator<<(std::ostream &out, Matrix m);
      friend Matrix& Matrix::operator=(const Matrix& m);
      long operator()(int i, int j);
      friend Matrix operator*(const int factor, Matrix m); //factor*matrix
      friend Matrix operator*(Matrix m, const int factor); //matrix*factor
      friend Matrix operator*(Matrix m1, Matrix m2); //matrix*matrix
      friend Matrix operator+(Matrix m1, Matrix m2);

Solution

  • Your assignment operator should be a member function, not a friend. Your other operators should take parameters as const Matrix &, otherwise you'll make a copy of the Matrix objects used by the operator.