Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: shephiroth en 29 de Julio de 2005, 12:47:24 AM

Título: Un Problemilla
Publicado por: shephiroth en 29 de Julio de 2005, 12:47:24 AM
 Buenas.

Con un post reciente me replantee algunas cosillas, y me ha surgido este problema. Hasta ahora utilizaba std::vector con clases unicas por lo q no tenia problema. Actualmente se me ha complicado la cosa. Tengo algo como esto (abreviando):


class a{public:virtual void draw(){}};
class a1:public a{void draw{}};

std::vector <a> listado:

a   *dos = new a1();

listado.push_back(*dos);
((a)listado[0]).draw();
dos->draw();


La primera llamada (usando std::vector) omite la funcion virtual, ejecuta a::draw.....mientras q dos->draw ejecuta lo q quiero, a1::draw

Alguien sabría como utilizarlo???

Si no se puede, en a::draw podría hacer un switch, cast y llamar a draw, pero ademas de q sería llenar el codigo de defines y un largo switch, enlentecería el código.....se puede decir que en cada bucle del programa pasaría unas cuantas veces por eso (demomento llevo 2, pero se puede extender hasta 10 segun avance con el programa ^^;)

GRACIAS!!!
Título: Un Problemilla
Publicado por: _Grey en 29 de Julio de 2005, 01:14:33 AM
 Vale puede no haya tocado mucho las STL pero si te salta al draw() de a es por el "(a)".

Acaso no puedes hacer un listado[0].draw(); ?!

Por que no me extrañaria que no................bueno un poco, veras, lo que no me cuadra es el:

std::vector listado;

Yo usaria un :

std::vector <*a> listado:^

Que parece que lo deja mas claro, en fin, si no que pase el experto.....

Saludos!
Título: Un Problemilla
Publicado por: Pogacha_Reserva en 29 de Julio de 2005, 01:29:35 AM
 Si eso esta mal, al poner en el vector una cosa muy probablemente estará copiandola literalmente tal vez con memcpy, usa punteros como _Grey dice que se facilitará la vida.
Saludos
Título: Un Problemilla
Publicado por: shephiroth en 29 de Julio de 2005, 01:42:20 AM
 Okas, muchas gracias, puse el std::vector y ahora funciona perfectamente el virtual.

Muchas gracias ^^
Título: Un Problemilla
Publicado por: ProD en 29 de Julio de 2005, 11:17:56 AM
Buenas, el problema que tenias es debido a que el polimorfismo solo funciona con punteros, si utilizas un contenedor de tipo... vector en vez de usar uno de tipo vector tendrás problemas al guardar en ese vector una clase derivada de a. Es por eso que en tu ejemplo al meter un objeto de tipo a1 en tu vector de tipo a, siempre te ejecutaba el ::draw de la clase padre en vez de la derivada. Tenez cuidado con este tipo de cosas. Saludos