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.
Desafío
FácilSentemos 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 estructuraShape. Después, define dos tipos de puntero a función:DrawFunc: recibe un parámetroconst Shape*y no devuelve nadaAreaFunc: recibe un parámetroconst Shape*y devuelve undouble
Shape, que contiene dos punteros a funciones:draw(de tipoDrawFunc) yarea(de tipoAreaFunc). 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: imprimeDrawing test shapetest_area: devuelve42.0
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
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írculoImplementación del rectánguloUso polimórficoContenedor de figurasPractica por tu cuenta: Compilador de C online