Menu
Coddy logo textTech

Resumen: Caja secreta

Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 21 de 61.

challenge icon

Desafío

Fácil

Vamos 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 tipo Box opaco 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 Box
    • destroy_box — libera la memoria asignada
    • get_volume — toma un const Box * y devuelve el volumen (ancho × alto × profundidad)
    • set_dimensions — toma un puntero Box y tres nuevos valores de dimensión, devuelve int (1 para éxito, 0 si alguna dimensión es negativa o cero)
    Usa protectores de inclusión (include guards) con el símbolo BOX_H.
  • box.c: Define el struct Box real con tres miembros ocultos: int width, int height e int depth. Implementa las cuatro funciones. Tu constructor debe asignar e inicializar la caja. La función set_dimensions debe 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}
Destroyed

Por ejemplo, con las entradas 2, 3, 4, 5, 5, 5, la salida sería:

Volume: 24
Set: 1
Volume: 125
Destroyed

Con las entradas 2, 3, 4, -1, 5, 5, la salida sería:

Volume: 24
Set: 0
Volume: 24
Destroyed

Observa 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