[C con Clase] Problema con Clases abstractas.

Joaquin Ezpeleta chele en chele.com.ar
Jue Feb 14 03:24:03 CET 2008


Buenas tengo un pequeño problema que me tiene desconcertado. Estoy trabajando en un programa gráfico muy simple usando Allegro y hasta ahora todo funcionaba muy bien. El problema lo tengo con este código:
 
class shape_c {    public:        shape_c(){    x = rand() % 100;    y = rand() % 100;    col = rand() % 255 + 1;    xs = rand() % 10;    ys = rand() % 10;    }        virtual void draw(BITMAP *bmp) const = 0;        virtual void update() = 0;        protected:                  int x,y;    int col;    int xs, ys;    int w,h;    int r;};  class circle_c : public shape_c {    public:      circle_c(){       r = rand() % 35;     }        void draw(BITMAP *bmp) const;        void update(){    x += xs;    y += ys;    if(x > SCREEN_W) xs *= -1;    if(y > SCREEN_H) ys *= -1;    if(x < 0) xs *= -1;    if(y < 0) ys *= -1;    }        protected:    int r;    };
void circle_c::draw(BITMAP *bmp) const {     circlefill(bmp, x, y, r, col);     }
class square_c : public shape_c{    public:               square_c(){    w = rand() % 50;    h  = rand() % 50;    }        void draw(BITMAP *bmp) const;
    void update(){    x += xs;    y += ys;    if(x > SCREEN_W + w) x = 0;    if(y > SCREEN_H + h) y = 0;    }        protected:    int w,h;};
void square_c::draw(BITMAP *bmp) const {    rectfill(bmp, x, y, x + w, y + h, col);    }
 
Como verán hay una clase abstracta shape_c de la que derivan las clases square_c y circle_c, representando las respectivas figuras. Ahora bien, algunas de las variables que definen a una figura como sus coordenadas, su color y su velocidad, son comunes a cualquier figura (variables x, y, col, xs, ys). Sin embargo, algunas variables son especificas de cada figura, como r(radio), w (ancho) y h (altura). Y estas son la que traen problemas. Si las incluyo en sus respectivas clases (como hice en el código de arriba), el programa compila pero se cuelga al ejecutar. Si, en cambio, pongo las tres variables en la clase shape_c, el programa funciona perfectamente. Como verán una solución ya le encontré (más allá del minimo desperdicio de memoria y la pedida de claridad), pero lo que me importa más que nada es saber por qué pasa esto, puesto que estoy siguiendo casi al pie de la letra el ejemplo que se da en el curso (seccion "Clases abstractas"). Por si tiene algo que ver los objetos se definen de la siguiente manera:
 
shape_c *circles = new circle_c[CIRCLE_NUMBER];shape_c *squares = new square_c[SQUARE_NUMBER];
 
Espero que puedan solucionar esta pequeña duda que tengo. Muchas gracias desde ya y mis felicitaciones por la calidad y el rigor del curso y sobre todo por su gran dedicación.
 
Joaquin Ezpeleta.-
_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today it's FREE!
http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20080214/2a298fb7/attachment.html>


Más información sobre la lista de distribución Cconclase