Resumen: Caja secreta
Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 21 de 61.
Desafío
FácilConstruyamos 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 podrá acceder mediante las funciones que proporciones. ¡Este es el patrón completo de puntero opaco en acción!
Crearás tres archivos:
box.h: Tu interfaz pública. Declara un tipoBoxopaco usando únicamente una declaración anticipada: el cuerpo de la estructura permanece oculto. Declara estas funciones:create_box: recibe tres enteros (ancho, alto, profundidad) y devuelve un puntero a Boxdestroy_box: libera la memoria asignadaget_volume: recibe unconst Box *y devuelve el volumen (ancho × alto × profundidad)set_dimensions: recibe un puntero a Box y tres nuevos valores de dimensión, y devuelveint(1 si tiene éxito, 0 si alguna dimensión es negativa o cero)
BOX_H.box.c: Define lastruct Boxreal con tres miembros ocultos:int width,int heightyint 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 no supera la validación, rechaza toda la actualización y devuelve 0.main.c: Demuestra tu Box encapsulado creando uno, comprobando su volumen, intentando cambiar sus dimensiones (tanto con valores válidos como no válidos) y realizando correctamente la limpieza.
Recibirás cinco entradas: el ancho inicial, el alto inicial, la profundidad inicial, seguidos de tres nuevas dimensiones que se intentarán establecer (que pueden incluir valores no válidos).
En tu archivo principal, crea un Box con las dimensiones iniciales e imprime su volumen. Después, 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 con 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 no válidos: el código externo no puede eludir tus reglas porque las dimensiones están completamente ocultas tras tu interfaz.
Pruébalo tú mismo
#include <stdio.h>
#include "box.h"
int main() {
// Leer las dimensiones iniciales
int width, height, depth;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &depth);
// Leer las nuevas dimensiones a 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 las nuevas dimensiones y almacenar el resultado
// TODO: Imprimir si el set tuvo éxito en formato: "Set: {0 or 1}"
// TODO: Imprimir el volumen resultante en formato: "Volume: {volume}"
// TODO: Destruir el box e imprimir "Destroyed"
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