C/Visual C - Otra de arrays

 
Vista:

Otra de arrays

Publicado por Googol (255 intervenciones) el 15/11/2003 01:00:31
Hoola de nuevo.

Tengo otra preguntilla sobre arrays. En C++ es posible sobreescribir el operador que hace una conversión de tipos (o cast de tipos). Por ejemplo podríamos hacer una clase Integer que tuviera una conversión automática a tipo int:

class Integer {
public:
// Cosas por aquí ...
operator int() { return value; }
protected:
int value;
};

Con esto, tenemos implementada una conversión de tipos de la clase Integer al tipo int, por lo que es válido:

Integer objeto;
int entero;
[....]
entero = objeto;

Vale. Ahora yo lo que quiero es implementar un cast de tipos que me convierta la clase a una de mis matrices de 4x4 :-)

Una alternativa es usar los socorridos typedef's:

typedef float matriz4x4_t[4][4];
class Matriz4x4 {
protected:
matriz4x4_t datos;
public:
operator matriz4x4_t&() {
return datos;
}
};

Con esto, increíblemente, luego puedo hacer:

Matriz4x4 m;

m[0][0] = 1;

lo que me evita tener que implementar un método

Matrix4x4::dameDato(int, int)

más incómodo de utilizar.

Ahora la pregunta del millón es.... ¿¿cómo se hace eso sin el typedef?? Igual que con mi otra pregunta, esto es un reto personal no resuelto que quiero transmitiros :-D

¡¡Gracias!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Otra de arrays

Publicado por Geo (36 intervenciones) el 15/11/2003 04:33:19
¿A qué te refieres con lo de sin typedef?

typedef simplemente crea un "alias", no es una definición de un nuevo tipo estrictamente hablando, por lo que otra forma de hacerlo (creo yo), sería usando por ejemplo:
#define MATRIX_4X4(x) float x[4][4]

Aunque ten en cuenta que ando con sueño y quizá estoy desvariando :P.

Saludos,
José Jorge (Geo).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Otra de arrays

Publicado por Oliver++ (339 intervenciones) el 15/11/2003 04:43:09
està muy interesante, yo particularmente no tengo la menor idea de como resolver eso. Vamos a ver si chuidiang tiene alguna idea.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Otra de arrays

Publicado por chuidiang (677 intervenciones) el 17/11/2003 09:40:59
Tampoco se me ocurre nada, todo esto de los corchetes es demasiado liado para mi. Además de que no me he enterado muy bien de qué es lo que queremos hacer

¿Una clase matriz4x4 con operator [ ][ ]? Lo he intentado un poco, pero no se deja.

¿Una clase cualquiera con operator cast a float[4][4]? Tampoco se deja.

Aun me estoy pensando lo de la pregunta anterior del foro ...

Sed buenos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Otra de arrays

Publicado por Googol (255 intervenciones) el 18/11/2003 16:42:39
Vaya cosas que se me ocurren ¿eh? Gracias a los tres. Intentaré volver a explicar qué es lo que quiero (esta vez me temo que tampoco yo he encontrado una respuesta :'( ).

Tengo la tipica _clase_ Matriz4x4 que podría ser algo así:

class Matriz4x4 {
public:
Matriz4x4& operator+(const Matriz4x4& sumando) { for ... for ... ; }
Matriz4x4& operator-(const Matriz4x4& sustraendo) { for ... for ...; }
Matriz4x4& operator*(const Matriz4x4& multiplicador) { for. .. for ... for ...; }
protected:
float datos[4][4];
};

Con esto, podría hacer:

Matriz4x4 a,b,c;
[ Inicializacion ]
a = b*c - a;

Ahora la cosa es permitir acceder a los elementos de la matriz. La alternativa sencilla sería usar un método dameDato(int x, int y) o similar, pero es poco motivante :-)
Por desgracia (hasta lo que yo sé), no se puede sobrecargar el operador [ ][ ] (doble corchete). Una alternativa es sobrecargar el operador [ ] y que devuelva el _puntero_ a la fila i-ésima. Al devolver un puntero, el usuario puede utilizar un segundo corchete por la dualidad puntero-array para proporcionar la segunda coordenada de acceso. Por tanto, si el usuario pone matriz[1][2] lo que está ocurriendo es que se llama al operador [ ] con parámetro 1, se devuelve un puntero a la fila 1, y luego el [2] se ejecuta como cualquier uso de puntero con un índice.

Esa posibilidad está bien... pero yo soy aún más retorcido, y se me ocurrió la posibilidad de implementar el operador cast de tipos en lugar del operador [ ], de modo que mi clase se convierta automáticamente a una matriz de 4x4. La secuencia de ejecución ante matriz[1][2] anterior sería llamar a mi método de conversión a float[4][4], que devolvería el puntero a datos, y luego el [1][2] lo haría el compilador el acceso a una matriz de 4x4 del que tenemos el puntero.

Y la pregunta es... ¿¿cómo se implementa ese operador?? La solución que estoy usando es con un typedef:

typedef float matriz4x4_t[4][4];
class Matriz4x4 {
protected:
matriz4x4_t datos;
public:
operator matriz4x4_t&() { return datos; }
};

y querría hacerlo sin él.

¡¡Graacias por devanaros los sesos conmigo!! :-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Otra de arrays

Publicado por Loco (1 intervención) el 19/11/2003 05:18:31
se poco de c++ pero a ver si es esto lo que buscas, aunque te entendi poco

typedef float matriz4x4_t[4][4];
void main(void)
{
Matriz4x4 a, b, c;
a = b * c - a;

cout << *((float *)&a + sizeof(float)*4*4 ) << "\n";
cout << *((matriz4x4_t *)&a )[4][4] << "\n";
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Otra de arrays

Publicado por Oliver++ (339 intervenciones) el 19/11/2003 19:50:34
Bueno, está muy bien tu analisis, solo que está un poco enliado y seria mas facil escribir un metodo DameDato ( int x, int y ). Pero se me ocurre algo:
Sobrecargar el operador de acceso a miembro [ ] y pasarle una multiplicacion de la fila X por el numero de columna Y y luego sumarle Y

DameDato [ X * Y + Y ]
De esta manera me daria la direccion efectiva que apuntaria a un indice que corresponde al elemento indicado por X y Y como si fuera una matriz unidimencional.

Pero como quiera estaria muy enliado ahun para el usuario de la clase.

tambien podrias escribir una pequeña estructura o clase llamada CIndice, que contenca dos propiedades X y Y siendo cada una una coordenada de la matriz. De esta manera podrias escribir un metodo

DameDato [ index ];
y como la clase matriz conoce la clase CIndice solo te tocaria accesar a las propiedades que contienen los indices. Seria una mejor idea

pero ahun estaria muy enliado si no vas a realizar operaciones especiales con los indices que requieran calculos con sus coordenadas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Otra de arrays

Publicado por chuidiang (677 intervenciones) el 20/11/2003 10:10:13
Si recuerdas de un lio anterior que montaste ;-P, cuando intentabas hacer el new, llegaste a que la forma de declarar la matriz era algo asi como

float (* matriz)[4][4]

Luego te quedaste intentando encontrar un cast adecuado para asignar el new al puntero matriz.

Según lo veo, el problema que tienes es el mismo, se trata de encontrar el tipo de esa matriz, sin poner variable. Si resuelves el problema del new, seguramente resuelvas el del cast.

He hecho una "trampa" para tratar de sacar ese tipo. He declarado una funcion

void funcion (float (* matriz)[4][4])
{
}
y luego la he llamado pasandole un entero

int a;
funcion (a);

El compilador, como es de esperar, me da el error de que al parametro de tipo float(*)[4][4] le estoy pasando un entero, pero fijate por donde, me ha dicho cual es el tipo. Mira a ver si este tipo te sirve, tanto para el del new, como para tu operator cast. (soy vaguete para probarlo yo mismo)

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar