Menu
Coddy logo textTech

Descripción general del proyecto

Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 44 de 61.

challenge icon

Desafío

Fácil

Sentemos las bases para el proyecto Shape Drawer creando la estructura base Shape — una interfaz que define lo que cualquier forma puede hacer a través de punteros a funciones.

Crearás dos archivos para configurar este sistema polimórfico:

  • shape.h: Define la interfaz principal aquí. Primero, crea una declaración anticipada (forward declaration) para la estructura Shape. Luego, define dos tipos de punteros a funciones:
    • DrawFunc — recibe un parámetro const Shape* y no devuelve nada
    • AreaFunc — recibe un parámetro const Shape* y devuelve un double
    Finalmente, define la estructura Shape en sí, que contiene dos punteros a funciones: draw (de tipo DrawFunc) y area (de tipo AreaFunc). Esta estructura actúa puramente como una interfaz — no contiene datos específicos de la forma, solo comportamiento.
  • main.c: Demuestra que tu interfaz funciona creando una forma de prueba simple. Implementa dos funciones:
    • test_draw — imprime Drawing test shape
    • test_area — devuelve 42.0
    Crea una instancia de Shape, conéctala a estas funciones de prueba y luego llama a ambas a través de la interfaz. Imprime el resultado del área con un decimal.

Tu salida debería demostrar que los punteros a funciones funcionan correctamente:

Drawing test shape
Area: 42.0

¿Por qué la declaración anticipada? Quizás te preguntes por qué typedef struct Shape Shape; aparece antes de que la estructura esté completamente definida. Esto es necesario porque DrawFunc y AreaFunc hacen referencia a const Shape* en sus tipos de parámetros — pero en ese punto del archivo, el compilador aún no ha visto la definición completa de la estructura. La declaración anticipada le dice al compilador: "existe una estructura llamada Shape", lo cual es suficiente para usar un puntero a ella. La definición completa sigue más adelante. Este patrón es común en C siempre que una estructura necesita referenciarse a sí misma (directamente o a través de punteros a funciones).

La idea clave aquí es que Shape no sabe nada sobre círculos o rectángulos — solo sabe que cualquier forma debe ser capaz de ejecutarse en draw y calcular su area. En las próximas lecciones, crearás formas concretas que integren esta estructura base y proporcionen sus propias implementaciones. Recuerda usar guardas de inclusión (include guards) en tu archivo de cabecera.

Pruébalo tú mismo

#include <stdio.h>
#include "shape.h"

// TODO: Implementar la función test_draw
// - Toma un parámetro const Shape*
// - Imprime "Drawing test shape"
void test_draw(const Shape* shape) {
    // TODO: Imprimir el mensaje requerido
}

// TODO: Implementar la función test_area
// - Toma un parámetro const Shape*
// - Devuelve 42.0
double test_area(const Shape* shape) {
    // TODO: Devolver el valor del área de prueba
}

int main() {
    // TODO: Crear una instancia de Shape
    
    // TODO: Conectar la forma a las funciones test_draw y test_area
    
    // TODO: Llamar a draw a través de la interfaz
    
    // TODO: Llamar a area a través de la interfaz e imprimir con un decimal
    // Formato: "Area: %.1f\n"
    
    return 0;
}

Todas las lecciones de Object Oriented Programming