Estás en: Inicio >> Foros >> Informática >> Programación
Programación /

castear..

Participa en el tema castear.. en el foro Programación.
en C++, estoy con problemas cuando quiero castear un objeto a otra clase el caso ...

Buscar en este tema:
 
  •  
    #1 castear..
    en C++, estoy con problemas cuando quiero castear un objeto a otra clase

    el caso es.. tengo las clases A, B y C..
    B hereda de A, y C hereda de B..

    en un momento, a mi metodo le pasan un A, y tengo q castear a C..
    entonces hago "((C)A).metodoDeC()..."

    la cosa es q me rompia del lado del .h de C
    me pedia un constructor q reciba un A como parametro -C(A)-
    logre solucionar eso poniendo en A: "operator C ();"

    ahi me deja castear en paz..
    el tema es q ahora, en B.h donde tengo "class B: public A" me da un error
    de expected class before {
    :S

    como lo soluciono??
    +
     
    0
    Me gusta
     
    | Más
  • #2 Re: castear..

    Esta mal lo que queres hacer, primero y principal, para que haya polimorfismo entre clases tiene que haber referencias o punteros, te comento por que...

    Vos cuando tenes una variable de tipo X por ejemplo el compilador reserva un area de memoria del tamaño sizeof(X) ahora si vos casteas la variable X pelada a una Y por ejemplo que es superclase de X, lo que hace el compilador es copiar bit a bit datos de la variable que contiene al objeto X a la otra variable que es de tipo Y, truncando lo que no entre en ese espacio de memoria, es decir que si luego invocas a metodos polimorficos (virtuales) que necesitan atributos de X te va a romper en ejecucion...

    Es por eso que se usan referencias o punteros ya que ahi solo se copian las posiciones de memoria a donde apuntan y no el objeto en si...

    Por otro lado, para castear un objeto padre a una clase derivada el cast comun de C el que haces poniendo el tipo a castear entre parentesis no te sirve porque el compilador no sabe si ese cast se puede realizar, es por eso que C++ provee de varios operadores de cast seguros junto con el operador typeid(...) para poder hacer estas cosas...


    Un ejemplo seria asi...

    Supongamos que tengo mi clase A, luego B hereda de A, y C heredad de B...

    el codigo seria algo asi...

    Código:
    #include<typeinfo>
    
    A* miObjetoA = new C(); // Creo un objeto de tipo C almacenado en una variable de tipo puntero a A
    
    // Como la interfaz de A no tiene los metodos propios de C necesito castear a C para invocar algun metodo propio de C...
    
    C* miObjetoC = dynamic_cast<C>(miObjetoA); // Aca si se castea miObjetoC es distinto de NULL, si no se puede castear miOBjetoC tiene NULL
    
    if (miObjetoC != NULL) {
         miObjetoC->metodoPropioDeC();
    }
    
    // En caso de que miObjetoA sea una referencia, el operador dynamic_cast lanza excepcion...
    
    Saludos
    Pablo
    Me gusta este mensaje
  • #3 Re: castear..

    ta..

    lo voy a probar..
    graciass
    Editado por pbatalla - 26.10.2009 23:01 hs. | Motivo: error..
    Me gusta este mensaje
Estás en: Inicio >> Foros >> Informática >> Programación


Estadísticas del tema
  • 2 RESPUESTAS
  • 85 VISTAS
  • 2 USUARIOS RESPONDIERON
 
Ir arriba
Contacto | Acerca de | Ayuda | Términos Legales | privacidad | Pautas de convivencia | Mapa de los foros | TrabajÁ con nosotros
©2008 Psicofxp.com S.A. - Todos los derechos reservados
Certifica IAB