[C con Clase] Problema con Clases abstractas.
Steven R. Davidson
vze266ft en verizon.net
Vie Feb 15 19:20:44 CET 2008
Hola Joaquín,
Joaquin Ezpeleta wrote:
> 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:
>
[CORTE]
> 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.
>
Sigues el ejemplo del capítulo 38, pero no el del capítulo 37 el cual
usa un array de punteros a la clase base. Esto es lo que necesitas
hacer. Debes manipular los objetos virtuales a través de punteros (o
referencias) a 'shape_c'. Sin embargo, en tu ejemplo, creas varios
objetos de tipo 'circle_c' y de 'square_c', en lugar de arrays de
punteros a 'shape_c'. Esto es,
shape_c **circles = new shape_c *[CIRCLE_NUMBER];
shape_c **squares = new shape_c *[SQUARE_NUMBER];
// Instanciar los objetos
for( int i=0; i<CIRCLE_NUMBER; i++ ) circles[i] = new circle_c;
for( int i=0; i<SQUARE_NUMBER; i++ ) squares[i] = new square_c;
Si el array fuese estático, entonces escribiríamos el código de esta manera:
shape_c *circles[CIRCLE_NUMBER];
shape_c *squares[SQUARE_NUMBER];
// Instanciar los objetos
for( int i=0; i<CIRCLE_NUMBER; i++ ) circles[i] = new circle_c;
for( int i=0; i<SQUARE_NUMBER; i++ ) squares[i] = new square_c;
Esto es parecido al ejemplo del capítulo 37; puedes consultarlo yendo a:
http://c.conclase.net/curso/index.php?cap=037#039_constructores
Espero que esto aclare la duda.
Steven
Más información sobre la lista de distribución Cconclase