2009-12-28 33 views

Respuesta

10

La solución más fácil es usar el operador() ya que permite múltiples parámetros.

class M 
{ 
    public: 
     int& operator()(int x,int y) {return at(x,y);} 
    // .. Stuff to hold data and implement at() 
}; 


M a; 
a(1,2) = 4; 

La manera fácil es que el primer operador [] devuelve un objeto intermedio que el segundo operador [] devuelve el valor de la matriz.

class M 
{ 
    public: 
    class R 
    { 
     private: 
      friend class M; // Only M can create these objects. 
      R(M& parent,int row): m_parent(parent),m_row(row) {} 
     public: 
       int& operator[](int col) {return m_parent.at(m_row,col);} 
     private: 
       M& m_parent; 
       int m_row; 
    }; 

    R operator[](int row) {return R(*this,row);} 

    // .. Stuff to hold data and implement at() 
}; 

M b; 
b[1][2] = 3; // This is shorthand for: 

R row = b[1]; 
int& val = row[2]; 
val  = 3; 
+0

¿Un buen optimizador podría cambiar la versión proxy en un código tan eficiente como 'operator()'? – GManNickG

+0

Eso depende del compilador. Pero me gusta hacer que el uso de mis objetos sea tan intuitivo como posible. Cuanto más natural se siente al usar el objeto, menos probable es la operatividad de los errores. Personalmente prefiero el proxy pero son seis de media docena de los otros para esta situación y no podría decir definitivamente que uno es mejor que el otro. –

+0

Sí, siempre he usado 'operator()' pero creo que usaré un proxy esta vez (escribo motores de juego) y veré si crea algún problema. No me puedo imaginar que sería demasiado difícil para el compilador hacerlo tan rápido, ya que tendrá la definición completa de todos los operadores. – GManNickG

1

Puesto que usted desea almacenar sus elementos en matrices de tamaño fijo que va a ser bastante fácil:

#define ROWS 3 
#define COLS 4 

typedef int row_type[COLS]; 

class matrix { 
    row_type elements[ROWS]; 
public: 
    ... 
    row_type const& operator[](int r) const {return elements[r];} 
    row_type  & operator[](int r)  {return elements[r];} 
    ... 
}; 

que debería funcionar.

Además, es posible que desee reemplazar el #define s con constantes adecuadas o utilizar parámetros de plantilla para tipo (int) y tamaño (3x4) para hacer que su clase de matriz sea más genérica. Si desea admitir tamaños dinámicos, su operador [] necesita devolver objetos proxy. Es posible, pero probablemente prefiera operador() con dos parámetros de índice para acceso a elementos.

Cuestiones relacionadas