PDA

Ver la versión completa : [Ayuda] Miembros estáticos en C++



Puck2099
02/03/2009, 08:55
Hola,

Estaba pensando en implementar una clase para manejar sprites para mi nuevo Lady Killer, pero tengo unas dudillas acerca de los miembros estáticos, a ver si algún entendido del C++ me puede ayudar.

Según tengo entendido los miembros estáticos son compartidos por todos los objetos que se creen de una clase, así que mi idea es que en la clase de un determinado tipo de personaje (que heredaría de una clase genérica de sprites) donde están las operaciones específicas para éste (movimientos, inteligencia artificial, etc.) se almacenara en un miembro estático la superficie (SDL) con las imágenes de este personaje.

Al declarar la clase se usaría una función tipo SDL_LoadBMP para abrir un BMP, cargar en memoria y asignar un puntero a la superficie que se quedaría guardado en el miembro estático.

Con esto cada objeto que se creara de este tipo de personaje tendría ya acceso a sus gráficos sin necesidad de hacer nada más, ¿verdad?

Mi duda es a la hora de salir del nivel, habría que incorporar una función estática para liberar esta memoria, ¿no?

Creo que es así como digo, pero si alguien ve algo raro que avise, please :brindis:

juanvvc
02/03/2009, 09:07
Mi duda es a la hora de salir del nivel, habría que incorporar una función estática para liberar esta memoria, ¿no?

Una función estática de la clase Personaje para cargar los sprites al principio de cada nivel y otra para liberarlos parece una buena solución, sí. Otra posible solución es que tengas una clase especial "almacén de sprites" y que los objetos llamen cada vez que quieran acceder a sus sprites. Tú mismo.

saucjedi
02/03/2009, 09:11
Puedes liberar la memoria en el destructor de la clase si tienes un contador estático de objetos. En cada construcción lo incrementas y en cada destrucción lo decrementas. Si en una invocación al destructor la cuenta llega a cero, liberas la memoria. Lo mismo en el constructor, cuando detectes que dicha referencia es cero (el valor inicial) reservas memoria y haces la carga.

El constructor y el destructor no son estáticos en sí pero son únicos para la clase (aunque puedes tener varios por clase, claro) y tienen acceso como todos los métodos a las variables estáticas.

Es un método bastante bueno porque no tienes que comprobar explícitamente estos casos, se hace en cada construcción de objeto nuevo.

juanvvc
02/03/2009, 09:31
Puedes liberar la memoria en el destructor de la clase si tienes un contador estático de objetos.

Esa solución vale si destruyes los personajes y los vuelves a crear en cada nivel, pero en la descripción de Puck he entendido que los objetos de personajes permanecen inmutables entre niveles, excepto el gráfico :)

Pero destruir y volver a crear los personajes en cada nivel y llevar un contador tampoco es mala solución. De hecho me suena que algunas partes de Fenix funcionan precismente así, igual que los recolectores de basuras de muchos lenguajes. A mí me parece bastante limpia si el estado de los personajes no contiene mucha información. Supongo que en RPGs, por ejemplo, no sería viable.

Ala, ahí tienes tres alternativas. Ya nos contarás qué escoges :D

Puck2099
02/03/2009, 09:39
Pues la verdad es que la opción del contador no se me había ocurrido y me resulta bastante interesante.

Los personajes sí cambian entre cada nivel, así que creo que voy a meditar sobre esta opción.

Muchas gracias :brindis:

saucjedi
02/03/2009, 10:31
En el caso que comenta Juanvvc sí que tendrías que hacer rutinas estáticas a parte e invocarlas cuando quieras... pero pensé que destruirías todo y recrearías al cargar, por eso te lo sugerí.

No he entendido lo de los RPG... imagino que dependerá también de lo que consideres un nivel en un RPG en concreto.