Resumen: Caja secreta
Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 21 de 61.
Desafío
FácilVamos a construir un módulo Box que demuestre una encapsulación completa. Tu caja tendrá tres dimensiones ocultas (ancho, alto y profundidad) a las que solo se puede acceder a través de las funciones que proporciones. ¡Este es el patrón de puntero opaco (opaque pointer pattern) completo en acción!
Crearás tres archivos:
box.h: Tu interfaz pública. Declara un tipoBoxopaco usando solo una declaración anticipada (forward declaration); el cuerpo de la estructura permanece oculto. Declara estas funciones:create_box— toma tres enteros (ancho, alto, profundidad) y devuelve un puntero Boxdestroy_box— libera la memoria asignadaget_volume— toma unconst Box *y devuelve el volumen (ancho × alto × profundidad)set_dimensions— toma un puntero Box y tres nuevos valores de dimensión, devuelveint(1 para éxito, 0 si alguna dimensión es negativa o cero)
BOX_H.box.c: Define elstruct Boxreal con tres miembros ocultos:int width,int heighteint depth. Implementa las cuatro funciones. Tu constructor debe asignar e inicializar la caja. La funciónset_dimensionsdebe validar que los tres valores sean positivos (mayores que cero) antes de aplicar los cambios; si algún valor falla la validación, rechaza toda la actualización y devuelve 0.main.c: Demuestra tu Box encapsulado creándolo, verificando su volumen, intentando cambios de dimensión (tanto válidos como inválidos) y limpiando adecuadamente.
Recibirás cinco entradas: el ancho inicial, alto inicial, profundidad inicial, seguidos de tres nuevas dimensiones para intentar establecer (que pueden incluir valores inválidos).
En tu archivo principal, crea un Box con las dimensiones iniciales e imprime su volumen. Luego intenta establecer las nuevas dimensiones: imprime si la actualización tuvo éxito y el volumen resultante. Finalmente, libera la caja y confirma la limpieza.
Imprime la salida en este formato:
Volume: {volume}
Set: {0 or 1}
Volume: {volume}
DestroyedPor ejemplo, con las entradas 2, 3, 4, 5, 5, 5, la salida sería:
Volume: 24
Set: 1
Volume: 125
DestroyedCon las entradas 2, 3, 4, -1, 5, 5, la salida sería:
Volume: 24
Set: 0
Volume: 24
DestroyedObserva cómo la validación en set_dimensions protege tu caja de estados inválidos: el código externo no puede eludir tus reglas porque las dimensiones están completamente ocultas detrás de tu interfaz.
Pruébalo tú mismo
#include <stdio.h>
#include "box.h"
int main() {
// Leer dimensiones iniciales
int width, height, depth;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &depth);
// Leer nuevas dimensiones para intentar
int new_w, new_h, new_d;
scanf("%d", &new_w);
scanf("%d", &new_h);
scanf("%d", &new_d);
// TODO: Crear un Box con las dimensiones iniciales
// TODO: Imprimir el volumen inicial en formato: "Volume: {volume}"
// TODO: Intentar establecer nuevas dimensiones y almacenar el resultado
// TODO: Imprimir si el cambio tuvo éxito en formato: "Set: {0 or 1}"
// TODO: Imprimir el volumen resultante en formato: "Volume: {volume}"
// TODO: Destruir la caja e imprimir "Destroyed"
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