C++ overload operator [ ][ ]

Tomas Sykora picture Tomas Sykora · Apr 2, 2013 · Viewed 16.7k times · Source

I have class CMatrix, where is "double pointer" to array of values.

class CMatrix {
public:
    int rows, cols;
    int **arr;
};

I simply need to access the values of matrix by typing:

CMatrix x;
x[0][0] = 23;

I know how to do that using:

x(0,0) = 23;

But I really need to do that the other way. Can anyone help me with that? Please?

Thank you guys for help at the end I did it this way...

class CMatrix {
public:
   int rows, cols;
   int **arr;

public:
   int const* operator[]( int const y ) const
   {
      return &arr[0][y];
   }

   int* operator[]( int const y )
   {
      return &arr[0][y];
   }

   ....

Thank you for your help I really appreciate it!

Answer

unkulunkulu picture unkulunkulu · Apr 2, 2013

You cannot overload operator [][], but the common idiom here is using a proxy class, i.e. overload operator [] to return an instance of different class which has operator [] overloaded. For example:

class CMatrix {
public:
    class CRow {
        friend class CMatrix;
    public:
        int& operator[](int col)
        {
            return parent.arr[row][col];
        }
    private:
        CRow(CMatrix &parent_, int row_) : 
            parent(parent_),
            row(row_)
        {}

        CMatrix& parent;
        int row;
    };

    CRow operator[](int row)
    {
        return CRow(*this, row);
    }
private:
    int rows, cols;
    int **arr;
};