Newsgroup: it.comp.lang.c++
Titolo: Domanda scema

Ciao a tutti
Come posso overloadare l'operatore [][]?
Ok, per [] è facile, ma non riesco a capire come fare per un array
bidimensionale..
(non ditemi di usare mappe, stl o robe simili!)
Ciao e grazie per l'aiuto,
Dome

 (non ditemi di usare mappe, stl o robe simili!)
FAQ.  La Q/A 13.8 della FAQ list di comp.lang.c++ dice:
==============================================================================
[13.8] How do I create a subscript operator for a Matrix class?
Use operator() rather than operator[].
When you have multiple subscripts, the cleanest way to do it is with operator()
rather than with operator[].  The reason is that operator[] always takes
exactly one parameter, but operator() can take any number of parameters (in the
case of a rectangular matrix, two paramters are needed).
For example:
    class Matrix {
    public:
      Matrix(unsigned rows, unsigned cols);
      double& operator() (unsigned row, unsigned col);
      double  operator() (unsigned row, unsigned col) const;
      // ...
     ~Matrix();                              // Destructor
      Matrix(const Matrix& m);               // Copy constructor
      Matrix& operator= (const Matrix& m);   // Assignment operator
      // ...
    private:
      unsigned rows_, cols_;
      double* data_;
    };
    inline
    Matrix::Matrix(unsigned rows, unsigned cols)
      : rows_ (rows),
        cols_ (cols),
        data_ (new double[rows * cols])
    {
      if (rows == 0 || cols == 0)
        throw BadIndex("Matrix constructor has 0 size");
    }
    inline
    Matrix::~Matrix()
    {
      delete[] data_;
    }
    inline
    double& Matrix::operator() (unsigned row, unsigned col)
    {
      if (row >= rows_ || col >= cols_)
        throw BadIndex("Matrix subscript out of bounds");
      return data_[cols_*row + col];
    }
    inline
    double Matrix::operator() (unsigned row, unsigned col) const
    {
      if (row >= rows_ || col >= cols_)
        throw BadIndex("const Matrix subscript out of bounds");
      return data_[cols_*row + col];
    }
Then you can access an element of Matrix m using m(i,j) rather than m[i][j]:
    main()
    {
      Matrix m;
      m(5,8) = 106.15;
      cout << m(5,8);
      // ...
    }
==============================================================================
(Cosa hai contro la STL?)
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy          loreti at pd dot infn dot it

 (non ditemi di usare mappe, stl o robe simili!)
Beh, le mappe lasciamole stare, l'stl non so cosa sia (eh eh), "robe
simili" č un'indicazione troppo vaga...
Un vettore bindimensionale di interi lo definirei cosě:
  std::vector< std::vector< int > > m;
  m.resize(20);
  m[19].resize(20);
  m[19][19] = 10;
Studiano quello che accade quando scrivi m[19][19] capisci come ottenere
lo stesso effetto con altre classi.
Max

 simili" è un'indicazione troppo vaga...
STL sta per Standard Template Library, quindi anche i vector  :)
Dome

Cavolo!!
E' vero!
Dome

On Tue, 30 Apr 2002, [D0M3] wrote:

Beh, era una battuta. Ma forse tu non frequentavi ancora il gruppo ai
tempi in cui Martelli spiegava quanto fosse inappropriato usare il termine
STL per riferirsi a una parte della Libreria Standard del C++.
Max

 STL per riferirsi a una parte della Libreria Standard del C++.
Non avevo capito l'ironia, e cmq non ho mai detto che le stl sono una parte
della libreria standard del C++... Ho detto che STL vuol dire Standard
Template Library, e non penso proprio di sbagliare, puo venire anche
Martelli (inchino) a dirmi il contrario e resterei freddino...
Dome