Menu
Coddy logo textTech

Descripción general del proyecto

Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 44 de 61.

challenge icon

Desafío

Fácil

Sentemos las bases del proyecto Shape Drawer creando la estructura base Shape: una interfaz que define lo que cualquier figura puede hacer mediante punteros a funciones.

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

  • shape.h: Define aquí la interfaz principal. Primero, crea una declaración anticipada de la estructura Shape. Después, define dos tipos de puntero a función:
    • 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 propia estructura Shape, que contiene dos punteros a funciones: draw (de tipo DrawFunc) y area (de tipo AreaFunc). Esta estructura actúa únicamente como una interfaz. No contiene datos específicos de ninguna figura, solo comportamiento.
  • main.c: Demuestra que tu interfaz funciona creando una figura de prueba sencilla. 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, después, llama a ambas a través de la interfaz. Imprime el resultado del área con un decimal.

Tu salida debe demostrar que los punteros a funciones funcionan correctamente:

Drawing test shape
Area: 42.0

¿Por qué la declaración anticipada? Quizá 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 todavía no ha visto la definición completa de la estructura. La declaración anticipada le indica al compilador: «existe una estructura llamada Shape», lo cual es suficiente para usar un puntero hacia ella. La definición completa aparece después. Este patrón es común en C cuando una estructura necesita referenciarse a sí misma (directamente o mediante punteros a funciones).

La idea clave aquí es que Shape no sabe nada sobre círculos o rectángulos. Solo sabe que cualquier figura debe poder draw por sí misma y calcular su area. En las próximas lecciones, crearás figuras concretas que incorporen esta estructura base y proporcionen sus propias implementaciones. Recuerda usar protectores de inclusión en tu archivo de cabecera.

Pruébalo tú mismo

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

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

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

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

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C online