Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema Polimorfismo y Array bidimensiona[N][N]

Estas en el tema de Problema Polimorfismo y Array bidimensiona[N][N] en el foro de C/C++ en Foros del Web. Hola, estoy creando un juego y se me presenta el siguiente problema: Los escenarios están divididos en Tiles(cuadraditos), para saber si puedo atravesar o no ...
  #1 (permalink)  
Antiguo 07/08/2010, 17:52
 
Fecha de Ingreso: mayo-2008
Mensajes: 18
Antigüedad: 15 años, 11 meses
Puntos: 0
Problema Polimorfismo y Array bidimensiona[N][N]

Hola, estoy creando un juego y se me presenta el siguiente problema:
Los escenarios están divididos en Tiles(cuadraditos), para saber si puedo atravesar o no cada tile, tengo un array numérico.
He creado una clase padre TEscenario y quiero crear una subclase por cada escenario del juego.
La clase padre es algo así:
Código:
class TEscenario {
	public:
		TEscenario();
		(...)

		static const u8 Tiles[][]; // No sé cuántos elementos
};
y tengo la subclase Escenario1:
Código:
class Escenario1: public TEscenario{
	public:
		Escenario1();

		static const u8 Tiles[27][177];
};
Escenario1::Escenario1(){
	(...)
}
const u8 Escenario1::Tiles[27][177]=// Aquí lo inicializo, pero es demasiado largo para postearlo
El problema está en que en la clase padre da error la línea "static const u8 Tiles[][];", dice que en los array multidimensionales hay que indicar el tamaño de todas las dimensiones excepto de la primera, he probado a poner "static const u8 Tiles[]", pero al usar la segunda dimensión falla, como es lógico, también he probado "static const u8 **Tiles", pero al compilar falla en el linking.

He pensado que se podría solucionar dándole un límite de tamaño al array, pero no me gustaría darle un tamaño máximo a los escenarios.

Saludos y gracias por las molestias.

PD: Si utilizo la subclase directamente, sin el polimorfismo, funciona perfectamente, el problema es que no sé qué escenario tendré cargado y necesito el polimorfismo.
  #2 (permalink)  
Antiguo 07/08/2010, 21:40
Avatar de ehguacho  
Fecha de Ingreso: febrero-2010
Mensajes: 138
Antigüedad: 14 años, 2 meses
Puntos: 4
Respuesta: Problema Polimorfismo y Array bidimensiona[N][N]

la solucion más básica sería ponerle un limite exagerado, pero no creo que sea lo mejor.
sino lo que podes hacer es declararlo como "static const u8 **Tiles", pero vas a tener que andar reservando espacio cuando quieras meter elementos, con lo cual el codigo se va a volver extenso y complicado de mantener. yo optaria por la primer opcion; hoy en dia la memoria RAM no es problema, a diferencia de antes donde tenias que medir hasta el ultimo byte que reservavas.
__________________
Cine clásico en descarga directa! http://felliniycia.comule.com
  #3 (permalink)  
Antiguo 07/08/2010, 22:05
Avatar de gvite666  
Fecha de Ingreso: abril-2010
Mensajes: 65
Antigüedad: 14 años
Puntos: 4
Respuesta: Problema Polimorfismo y Array bidimensiona[N][N]

hola Kandorf tu problema es que un array es forsoso que le des un tamaño en especial para que el compilador sepa cuanta memoria reservar...oooo...utilizar "Memoria dinamica" que es lo que tu quieres, esto se utiliza para cuando, declaras un vector o una matriz pero no sabes cual es su tamaño y tienes que reservar memoria en tiempo de ejecucion.
Ejemplo:
Código C++:
Ver original
  1. int a;
  2. int b;
  3. int **Matriz;//declaras tu puntero de matriz (todavia no sabes que tamaño quieres)
  4. cout<<"Tamaño de columnas: ";
  5. cin>>a;
  6. cout<<"Tamaño de filas:";
  7. cin>>b;
  8. Matriz=new int*[a];//con "new" reservas memoria por el momento de un puntero a vector
  9. for(int i=0;i<a;i++)
  10.     Matriz[i]=new int[b];//reservas memoria para cada elemento a un elemento b (una matriz)
  11. /*con esto ya puedes usar una Matriz[a][b]*/
Pero mucho cuidado cuando reservas memoria porque el sistema no sabe cuando ya la dejaste de usar, asi que en C++ tienes que liberarla, para esto se usa tu destructor, (aclaro para cuando tu variable es un atributo, cuando solo es una variable local la tienes que liberar en tu misma funcion) en el tienes que liberar el espacio reservado asi:
Código C++:
Ver original
  1. for(i=0;i<a;i++)
  2.     delete [] Matriz[i];//libera el espacio de b para cada elemento de a
  3. delete [] Matriz;//liberas todo el espacio restante que reservaste.
Con esto te aseguras de reservar solo el espacio que se es necesario
Espero me halla explicado.
Saludos.
  #4 (permalink)  
Antiguo 08/08/2010, 17:01
 
Fecha de Ingreso: mayo-2008
Mensajes: 18
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Problema Polimorfismo y Array bidimensiona[N][N]

Hola, gracias por las respuestas a ambos.
ehguacho, me temo que la RAM sí es un problema, ya que el juego es para Nintendo DS y esta de RAM no va sobrada :(

Sobre reservar memoria en tiempo de ejecución, no sé si cambia algo, pero en la clase padre no sé cuántos elementos va a tener, pero en la clase hija sé exáctamente cuántos va a tener y cuáles son, por eso la declaro como static int y la inicializo directamente en la clase como "const u8 Escenario1::Tiles[27][177]={{(...)},{(...)},(...)}"

Si no se puede hacer de otra manera, supongo que lo haré reservando memoria en el constructor.

Saludos y gracias por vuestro tiempo.

Última edición por Kandorf; 09/08/2010 a las 04:44
  #5 (permalink)  
Antiguo 09/08/2010, 06:37
Avatar de gvite666  
Fecha de Ingreso: abril-2010
Mensajes: 65
Antigüedad: 14 años
Puntos: 4
Respuesta: Problema Polimorfismo y Array bidimensiona[N][N]

pues no es necesario declararlo en la clase padre, mira no se como te esten enseñando POO pero cuando a mi me enseñaron me digieron que la mejor manera de cambiar un atributo es usando un set y un get, ¿que es? son funciones que cambian y obtienen datos de tu atributo.
por ejemplo:
Código C++:
Ver original
  1. //file.h
  2. class padre
  3. {
  4.        void setTile(int a,int b);//le das el valor que quieres a tu atributo
  5.        u8 getTile(void);//esta funcion es para devolver el valor de tu atributo a quien te lo pida.
  6. };
  7. //file.cpp
  8. void Escenario1::setTile(int a,int b)
  9. {
  10.        //aqui es donde reservas tu memoria
  11. }
  12. //la otra funcion solo regresas la variable
bueno almenos asi lo haria yo y asi cuando use una clase hija ya puedo reservar memoria a mi conveniencia.
  #6 (permalink)  
Antiguo 09/08/2010, 17:25
 
Fecha de Ingreso: mayo-2008
Mensajes: 18
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Problema Polimorfismo y Array bidimensiona[N][N]

Muchas gracias, gvite666, finalmente haré algo como la idea que me has dado tú.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:04.