Descripción general del proyecto
Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 44 de 61.
Desafío
FácilSentemos 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 estructuraShape. Luego, define dos tipos de punteros a funciones:DrawFunc— recibe un parámetroconst Shape*y no devuelve nadaAreaFunc— recibe un parámetroconst Shape*y devuelve undouble
Shapeen sí, que contiene dos punteros a funciones:draw(de tipoDrawFunc) yarea(de tipoAreaFunc). 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— imprimeDrawing test shapetest_area— devuelve42.0
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
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculo