• Viernes 29 de Marzo de 2024, 10:04

Autor Tema:  Problema Con Polimorfismos Y Clases Abstractas  (Leído 2005 veces)

_RAPTOR_

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Problema Con Polimorfismos Y Clases Abstractas
« en: Sábado 22 de Abril de 2006, 00:40 »
0
Bueno, os pido ayuda porque ando muy desesperado, llevo dias y dias intentando luchar contra esta practica, pero me puede xDD

Iré al grano, tengo una clase llamada Componente (que guarda una String), que es abstracta, con funciones virtuales puras, de ella, creo otras clases, llamadas ComponenteTexto, ComponenteNumero, ComponenteFecha y ComponenteCompuesto (este ultimo es una vector con tipos Componente).

Ahora bien, tengo que crearme una función para los objetos ( ya que es virtual pura, la tendré que crear para cada objeto), la cual es Componente* copia() const.

La descripción de esta función es: Devuelve un nuevo objeto creado en memoria dinámica que es copia del actual. El objeto copiado debe ser independiente del original, o sea, no debe compartir datos.

Pero el caso es que no se como crear la copia del componentetexto y que sea del tipo componente. Que yo sepa, no puedo devolver un tipo Componente, ya que es abstracto y no se puede declarar un objeto de ese tipo, y estoy batallando contra mis compañeros de clase, que insisten en devolver un tipo componente.

Es esto posible?? o al devolver tipo componente se refiere a que devuelva al tipo de el objeto de la funcion???

EJ: si desarrollo el copia para componentetexto, que devuelva un componentetexto.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Problema Con Polimorfismos Y Clases Abstractas
« Respuesta #1 en: Sábado 22 de Abril de 2006, 03:28 »
0
De hecho se pueden declarar referencias a objetos de clases abstractas y es muy util hacerlo. Lo que no se permite es instanciar clases abstractas que es otra cosa. Asi que al momento de instanciar tu referencia a objeto de clase abstracta tienes que instanciar un descendiente no abstracto.

_RAPTOR_

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Problema Con Polimorfismos Y Clases Abstractas
« Respuesta #2 en: Sábado 22 de Abril de 2006, 16:46 »
0
si te he entendido bien, quieres decir que realmente no puedo devolver un objeto de tipo Componente* al ser abstracta, sino que debo devolver la clase descendiente a la que pertenece la función en ese momento. Ya que tengo que desarrollar la misma función para cada clase descendiente, copiando el mismo codigo, pero modificando el tipo devuelto no?  (todas las clases descendientes, heredan un tipo String, y ninguna aporta campo private, es decir, todas son intermanemte iguales, solo cambian en lo que guardarán y en sus funciones)

_RAPTOR_

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Problema Con Polimorfismos Y Clases Abstractas
« Respuesta #3 en: Domingo 23 de Abril de 2006, 20:38 »
0
weno, tengo ya casi solucionado el tema, pero acudo a ustedes con otra duda, tengo una función virtual pura del tipo Componente llamada string aRistra() const,  la cual desarrollan los descendientes ComponenteTexto, ComponenteNumero, ComponenteFecha y ComponenteCompuesto.

El caso es la función tiene el mismo cuerpo para los 3 primeros descendientes, es decir, un copiar y pegar. Cuando en el main hago las pruebas llamando a esta función de cada componente, me funciona en el Texto y en el Fecha, pero al compilar llamando al ComponenteNumero, me da el siguiente error:

undefined reference to "ComponenteNumero::aRistra()"
*g++ -opractica3.exe ./componentes.o ./pruebadoc.o In function "main"

no lo entiendo porque el código es exactamente el mismo que a las otras llamadas, y está bien desarrollado. Os dejo la parte para que la veais:

Citar
Componentes.h

class Componente
{
   //clase virtual pura
   protected:
  string ristra;
   public:
   virtual ~Componente()
   {
   }
   virtual string aRistra() const =0;
   virtual int ncaracteres() const =0;
   virtual int npalabras() const =0;
   virtual Componente* copia() const =0;
   
};

class ComponenteNumero: public Componente
{
 
   public:
   ComponenteNumero(int x);
   ~ComponenteNumero();
   string aRistra();
   ComponenteNumero(const ComponenteNumero &n);
   ComponenteNumero & operator=(const ComponenteNumero &n);
   string aRistra() const;
   int ncaracteres() const;
   int npalabras() const;
   Componente* copia() const;
};

no he copiado el resto de componentes, porque son iguales.
Citar
componentes.cpp

   //FUNCION QUE DA FALLO
   string ComponenteNumero::aRistra() const
   {
  return ristra;   
   }

   y aqui os dejo la de componenteFecha k me da bien

   string ComponenteFecha::aRistra() const
   {
  return ristra;
   }

en el main hago:

Citar
int main()
{
   ComponenteNumero z(2);
   z.aRistra();

el constructor tiene como parametro un int, que luego pasa a ser ristra.

sabeis a que se debe dicho fallo?? porque no linka bien?? catualmente estoy usando el Eclipse 3.1 que nos proporcionan en la universidad


gracias de nuevo

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Problema Con Polimorfismos Y Clases Abstractas
« Respuesta #4 en: Domingo 30 de Abril de 2006, 19:27 »
0
Hola,

El error del enlazador significa que no has definido la implementación de una función declarada en el fichero de cabecera. En tu caso has declarado:
Código: Text
  1.  string aRistra();
  2.  
  3.  
pero en el fichero de implementación has implementado:
Código: Text
  1. string ComponenteNumero::aRistra() const
  2.  
  3.  

Fíjate en el const del método. En verdad estás implementando un método diferente al que has declarado.

Un saludo,

Ruben3d