[C++ @ i386] Problema con clases, funciones repetidas
-
Descubrí que estoy repitiendo muchisimo código, pero no
pude encontrar la solución para no repetirlo.
Acá hice un resumen del problema, traté de usar
funciones virtuales pero sin éxito, tengo poca experiencia en elllas.
Bueno por eso lo dejo acá en el foro por si alguien sabe como solucionar esto.
Supongamos que tengo una clase punto, y clases derivadas con formas
de objetos, cuyo objeto principal es justamente un ARREGLO de puntos
que contiene varios puntos ubicados segun la forma.
//-----------------------------------------------------------------
class punto
{int x;
int y;
//..
public:
void dibuja(void);
//..
};
//-----------------------------------------------------------------
class circulounto
{//..
int cant;
punto *puntos;
public:
void dibuja(void);
//..
};
//-----------------------------------------------------------------
class lineaunto
{//..
int cant;
punto *puntos;
public:
void dibuja(void);
//..
};
//.. es para indicar otras lineas....
//observar que estas funciones son exactamente iguales
//-----------------------------------------------------------------
void linea::dibuja(void)
{for(int i;ipuntos[i].dibuja();
}
//-----------------------------------------------------------------
void circulo::dibuja(void)
{for(int i;ipuntos[i].dibuja();
}
//-----------------------------------------------------------------
El problema es que las funciones "dibuja" son exactamente iguales
y estoy tentado a usar una sola funcion dibuja para todas las formas.
Se agradece cualquier idea!! -
-
Intento de golfista -
01/01/2005#2 Re: [c++ problema con clases, funciones repetidas| (any) @ (I386)]Sencillamente tenés que sobrecargar el método dibuja() en las clases derivadas llamando al mismo método de la clase padre. Lo hacés así:
Aunque, me corrijo (agregado lunes 3 de enero)... si estás haciendo el método dibuja en la clase padre, no es necesario escribir una linea de código en las clases derivada si declarás a la función como un miembro public, ya que todos los public se heredan como tal (en una herencia tipo public). El código q tiré arriba, sirve si en las clases derivadas tenés que "sobrecargar" el método de la clase padre agregando determinada funcionalidad.Código:/* Tomamos de ejemplo tu clase circulo (que debería ser Circulo * Respetemos las convenciones de escritura de código, plz */ void Circulo:: dibuja () : Punto.dibuja() {/* Incluir el código adicional que se precise, en caso que tenga * que hacer algo más aparte de lo que hace el código de la clase padre, * en caso contrario, dejar las llaves vacías y punto. */}
Un ejemplo boludo: Imaginate una clase que maneje puntos en un plano y que tiene 2 coordenadas (x, y) y hago toooodo lo necesario para q maneje las 2 coordenadas. Ahora bien, genero una clase que maneja puntos pero en el espacio, por ende mis puntos ahora tienen 3 coordenadas (x, y, z), y puedo aprovechar todo lo que hice en mi clase punto, simplemente heredando de la clase punto, y "sobrecargando los métodos" para terminar de acomodar toda la lógica a la 3er coordenada (que es el eje Z).
Se entendió el ejemplo??? Sino, buscalo mucho más detalladamente en algún buen libro de C++ (recomendados el de Deitel y el de Stroustrup), que es un ejemplo "clásico" cuando se explica herencia. Eso es algo que deberías leerte bien: HERENCIA, ya que te vas a encontrar como manejar estas cosas de una forma bastante piola.
Espero q te sirva esto!!!!
El doc -
-
En realidad acá no puedo heredar el dibuja() de la clase Punto porque ahí usa solo x,y
pero en las otras clases x,y viene a significar el centro del circulo o el extremo de la linea
y el dibuja se refiere a punto *puntos que es un arreglo y no un punto.
Se me ocurre la idea de hacer una clase intermedia que se llame Puntos, que herede de punto, contenga un arreglo de puntos y el dibuja para después hacer que las clases circulo y linea
deriven de Puntos, en lugar de Punto, lo pruebo y después comento que pasó.
Gracias
