SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Epa en Lunes 7 de Junio de 2010, 17:12

Título: Sobrecarga del operador [ ]
Publicado por: Epa en Lunes 7 de Junio de 2010, 17:12
Buenas

Alguien tiene idea si es posible sobrecargar el operador [ ] de forma matricial? (no vectorial)

La idea sera hacer algo como

Código: C++
  1.  
  2. class A{
  3. public:
  4.    int operator[][][](int x, int y, int z){
  5.       return matriz[x][y][z];
  6.    }
  7. private:
  8.    int ***matriz;
  9. };
  10.  
  11.  

Lo probe pero me da el siguiente error:
error: la definición de la función no declara parámetros

Gracias de antemano
Saludos
Título: Re: Sobrecarga del operador [ ]
Publicado por: Jeysscarr en Martes 8 de Junio de 2010, 00:48
pasando vectores de N dimenciones, el compilador tiene que saber, por lo menos N-1 dimenciones, (un vector de N dimenciones = un vector de vectores de N-1 dimenciones...) asi sabe que memoria reservar...
lo mejor para inicializar una matriz en 0 es usar memset... osea

int matrix[5][7];

memset(matrix,0,sizeof(int)*5*7)
y al momento de pasar la matriz a una funcion, es mejor declarar un parametro del tipo int **, y dos params mas para cada una de las coordenadas...

(void TamañoMatriz(int **matrix, int n, int m) { memset(matriz, 0, sizeof(int)*n*m);}
Título: Re: Sobrecarga del operador [ ]
Publicado por: Epa en Martes 8 de Junio de 2010, 04:03
Buenas.

gracias por la respuesta, pero creo que no entendiste lo que pido.

Voy a tratar de explicarlo un poco mejor, haber si se entiende.

La calse que puse ahi, es de modo ilustrativo, era con la idea de que se entienda el concepto.
La clase real tiene una matriz de tres dimensiones de punteros a otra clase.
Algo como

Código: C++
  1.  
  2. class calse1
  3. {
  4. ...
  5. private:
  6.    clase2 ****punteros;
  7. };
  8.  
  9.  

la idea era poder sobrecargar el operador [ ] de la siguiente forma
Código: C++
  1.  
  2. const clase2* operator[][][](int x, int y, int z){
  3.    return punteros[x][y][z];
  4. }
  5.  
  6.  
para poder despues hacer algo como:
Código: C++
  1.  
  2. clase1[x][y][z]->metodoclase2();
  3.  
  4.  

y evitar tener que hacer algo como:
Código: C++
  1.  
  2. clase2* clase1::getElemento(int x, int y, int z){
  3.    return punteros[x][y][z];
  4. }
  5.  
  6.  
para despues tener que hacer algo como:
Código: C++
  1.  
  2. clase2 * pclase2;
  3. pclase2 = clase1.getElemento(x,y,z);
  4. pclase2->metodoclase2();
  5.  
  6.  

Creo que en todo caso haria algo como:
Código: C++
  1.  
  2. typedef struct
  3. {
  4.    int x,y,z;
  5. } coor;
  6.  
  7. const clase2* operator[](coor c){
  8.    return punteros[c.x][c.y][c.z];
  9. }
  10.  
  11.  

pero lo ideal es la primera opcion, ya que lo necesito para hacer bucles (bastante grandes), y me ahorro andar copiando las variables en la estructura para despues pasarla.

Bueno, espero que se entienda mejor la idea.
Saludos
Título: Re: Sobrecarga del operador [ ]
Publicado por: Jeysscarr en Martes 8 de Junio de 2010, 04:10
Si, definitivamente se entiende más lo que quieres decir  :P
Título: Re: Sobrecarga del operador [ ]
Publicado por: diego.martinez en Martes 8 de Junio de 2010, 10:19
El operador [] no se puede sobrecargar de forma matricial.
El operador [] es unario, solo acepta un parametro, por lo tanto, no puedes pasarle más.
Para hacer lo que quieres, es mejor que sobrecargues el operador ().
El opertador paréntesis si que acepta multiples parametros tal y como quieres hacer

Código: C++
  1.  
  2. DATO * operator ()(int a, int b, int c)
  3. {
  4. return matrix[a][b][c];
  5. }
  6.  
Título: Re: Sobrecarga del operador [ ]
Publicado por: Epa en Martes 8 de Junio de 2010, 23:31
Funciona barbaro!
Nunca se me hubiese ocurrido algo asi.

Muchas gracias  :beer: