Przeciążenie operatora []

napisałem sobie listę, która to będzie przedstawiać jakąś macierz.

Żeby się sprawnie można było po całości poruszać wpadłem na pomysł, żeby sobie przeciążyć operator indeksowania. Problem jednakowoż polega na tym, że macierze mają nie jeden a dwa wymiary, więc potrzebuję dwóch operatorów [][].

ja więc funkcję tego typu :

int & operator[](int id)

		{

		return id;

		}

zamienić, żeby przyjmowała 2 operatory indeksowania?

Nie da się. Albo użyj zwykłej funkcji z dwoma parametrami, albo zwróć za pomocą operatora [] coś, na czym znów można by użyć [].

class Macierz{   double *T;   unsigned Y,X;   class Row{      Macierz M;      unsigned y;      public:      Row(Macierz M,unsigned y):M(M),y(y) {}      double operator[](unsigned x) { return M.T[y*M.X+x]; }     };   public:   Row operator[](unsigned y) { return Row(*this,y); } }; [/code]To tylko generalny zarys jak to zrobić.

@ [alex]

Jakaś strasznie skomplikowana ta twoja macierz. Nic z niej nie rozumiem.

Moja jest chyba trochę lepsza i bardziej zrozumiała:

{    public:        class Row {            private:                unsigned int width;                double *numbers;            public:                Row();                (const unsigned int x)                ~Row()                double operator[](const unsigned int x) const;        };        :        unsigned int width, height;        Row *rows;        :        Matrix();        Matrix(const unsigned int y, const unsigned int x);        ~Matrix();        Row operator[](const unsigned int y) const;

Ciał konstruktorów i operatorów Ci nie podam, bo to by było niezbyt edukacyjne.

Mogę tylko podpowiedzieć, że w konstruktorach używany jest "new".

Nie wiem czy jest dobrym pomysłem trzymać macierz w kawałkach. W mojej wersji wszystko jest w jednej tablice. Row - to tylko wirtualny twór który pozwala zapamiętać referencje na macierz oraz numer wiersza, który istnieje tylko po to aby móc używać nawiasów kwadratowych.

Z tym że dla macierzy możemy przeciążyć dwa operatory:

const double &Macierz::operator()(unsigned x,unsigned y) const; // tylko do odczytu dla stałych

double &Macierz::operator()(unsigned x,unsigned y);

i używać:

Macierz M(10,10);

double x=M(1,2);

M(2,1)=x;

#include 


template

struct matrix

{

   matrix(int x, int y) 

      : buffer(x, std::vector(y)) 

   { 

   }


   std::vector& operator[](int x) 

   { 

      return buffer[x]; 

   } 


private:

   std::vector > buffer;

};

pebal , po cholery tak komplikować, skoro już chcesz użyć wektora to:

#include

Bo zawieranie różni się od dziedziczenia.

Owszem, różni się, ale to nie jest wystarczający powód aby komplikować sobie życia, przynajmniej wg mnie.