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

Crash con objecto devuelto de un map

Estas en el tema de Crash con objecto devuelto de un map en el foro de C/C++ en Foros del Web. Buenas! Tengo el siguiente código, en el cual introduzco un objecto 'testclass' ( clase hija de 'object'), y posteriormente la busco y retorno. El problema ...
  #1 (permalink)  
Antiguo 30/09/2012, 07:50
 
Fecha de Ingreso: septiembre-2012
Mensajes: 38
Antigüedad: 11 años, 7 meses
Puntos: 0
Crash con objecto devuelto de un map

Buenas!
Tengo el siguiente código, en el cual introduzco un objecto 'testclass' ( clase hija de 'object'), y posteriormente la busco y retorno. El problema esta al acceder a un miembro del objeto retornado, momento en el cual crashea el programa.

Código:
    std::map<std::string, object> loadedObjects;
    testclass tst;  // testclass se extiende de object
    tst.name = "hector";
    loadedObjects.insert(std::pair<std::string, object>("gola",tst));
    std::map<std::string, object>::iterator i = loadedObjects.find("gola");
    if(i == loadedObjects.end())
    {
        cout<<"no se ha encontado nada"<<endl;
    }
    else
    {
        cout<<i->first<<endl;
        testclass* tst2 = (testclass*) &i->second;
        cout<< tst2->name<<endl;   //crasheo en este punto
    }
¿Alguien sabe que ocurre?
  #2 (permalink)  
Antiguo 02/10/2012, 01:10
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: Crash con objecto devuelto de un map

Ohhh. Esta es una de las razones por las cuales no me gusta la STL. El codigo se vuelve casi ilegible y propenso a "efectos secundarios".

No te puedo decir con certeza que ocurre, pero si tengo una teoría.

Tienes un objeto llamado objeto de tipo objeto.
Y derivas una clase hija llamada testclass.

No se si testclass tenga más métodos.

Ahora, declaras un mapa de pares strings y objetos. Hasta ahí todo bien.
Después viene lo interesante.
Insertas en alguna variable(vector, lista o algo) un nuevo par que contiene de texto gola y la clase tst.
Pero como defines que el insert sólo acepta objeto, entonces la información "extra" de testclass se pierde ya que no usas una referencia o un puntero.
Sin embargo la información que si es parte de objeto se conserva, y el programa sigue.

Con el iterador encuentras el objeto que antes era testclass.
Luego con un apuntador tipo testclass apuntas a este objeto que en realidad ya es del tipo objeto.
Entonces al querer ejecturar un método que en realidad no existía sobre información que tal vez no existía pues crash!!!.

Curiosamente esto no sucede en todos los lenguajes orientados a objetos, cada uno tiene una manera de tratar este singular problema.

Te recomendaría que revisaras esto con un depurador para confirmarlo o refutarlo.

Espero mi explicación se haya entendido.

Saludos
  #3 (permalink)  
Antiguo 07/10/2012, 09:46
 
Fecha de Ingreso: septiembre-2012
Mensajes: 38
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Crash con objecto devuelto de un map

Al final lo solucione almacenando en el mapa no el objeto, sino el puntero del objeto.

std::map<std::string, object*> loadedObjects;

Gracias por la respuesta!
  #4 (permalink)  
Antiguo 08/10/2012, 14:03
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: Crash con objecto devuelto de un map

Si. El problema se arregla con polimorfismo. Al parecer el error si era lo que te mencionaba.

Saludos

Etiquetas: cast, crash, map
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 20:25.