Ezequiel Pereira escribió:El ejecutable de mi juego usa librerías dinámicas para ahorrar peso en el ejecutable y que sea fácil de editar.
Pero en una librería necesito usar clases, derivar de las mismas y re-definir una función para hacer personajes "vivos" en mi juego pero tengo un problema.
Eso se llama programación dinámica, es decir, crear cosas en tiempo de ejecución, si, entiendo, es un problema común, y más por que para hacerlo se tienen que utilizar punteros...
Ezequiel Pereira escribió:No logro solucionarlo con nada y con GDB no encuentro nada raro, lo único que encuentro es que el error esta en la linea 523 de util.h.
Eso es por que intentas acceder a lugares "oscuros" de la memoria. (a eso se le conoce como "segmentation fault (core dumped) "/"Fallo de segmentación (nucleo volcado)" )
Aquí dejare un ejemplo de código que yo he hecho, utilizando vector y que permite utilizar la herencia, si tienes dudas, pregunta.
(además, no es por ofender, pero tu código es muy jeroglífico

)
#include <vector>
//creo un vector que contiene apuntadores a la clase Sprite.
//es un apuntador para permitir utilizar la herencia...
//typedef es un viejo truco en c que permite utilizar un alias, en lugar de escribir vector<Sprite*>
//puedo escribir SpriteGrup, que es mucho mas intuitivo. Pero esto solo aplica a tipos de datos.
typedef vector<Sprite*> SpriteGrup;
//creamos un iterador, permite hacer algunos bucles más fáciles...
SpriteGrup::iterator it;
//creo una función para limpiarlo, recuerda, que los punteros no liberan memoria en automático...
void limpia_grupo(SpriteGrup Grupo){
int i;
for(i = 0; i < Grupo.size(); ++i) delete Grupo[i];
};
//defino un grupo para poder trabajar con los Enemigos...
SpriteGrup ENEMIGOS;
//también creo un puntero que me permitirá usar la magia de la herencia de forma dinamica
Enemigo * SPR_ENEMIGO;
//los Enemigos heredan directamente de los Sprites
//pero como los Enemigos siguen siendo Sprites, podemos meterlos en un grupo de Sprites
//de esta manera...
ENEMIGOS.push_back( new Enemigo() );
//o de esta otra...
Enemigo * temp = new Enemigo();
ENEMIGOS.push_back( temp );
//ya en el juego...
for(i=0;i<ENEMIGOS.size();i++){
ENEMIGOS[i]->update();
//update es un método virtual de la clase Sprite. Todos los hijos de Sprite la pueden usar...
//pero enemigo lo redefine, por esto es que esta definida como virtual
//pero para las cosas que solo puede hacer el sus hijos (en este caso, la clase Enemigo *)
//hay que hacer un "cast" (en español seria algo así como "lanzar", "arrojar")
//es decir, indicarle a ese Sprite* que debe convertirse en la clase Enemigo*
SPR_ENEMIGO = (Enemigo *)ENEMIGOS[i]; //recordemos que ENEMIGOS[i] es un Sprite*
//una vez terminado, podemos llamar a los métodos que solo puede usar la clase Enemigo
SPR_ENEMIGO->Hacer_Algo_Que_Solo_Puede_Hacer_El_Enemigo() ;
}
//mas adelante...
//la razón del iterador...
for (it = ENEMIGOS.begin(); it != ENEMIGOS.end(); it++) (*it)->draw_center(pantalla);
//nos ahorra lineas, recordemos que ENEMIGOS contiene Sprites* y "draw_center"
//ese es un método de los Sprites
//lamentablemente, con el iterador no podemos hacer cast para utilizar la herencia.
Espero haber sido lo bastante claro, si no, pregunta.