Menu
Coddy logo textTech

Resumen: Caja secreta

Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 21 de 61.

challenge icon

Desafío

Fácil

Construyamos 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 tipo Box opaco 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 Box
    • destroy_box: libera la memoria asignada
    • get_volume: recibe un const Box * y devuelve el volumen (ancho × alto × profundidad)
    • set_dimensions: recibe un puntero a Box y tres nuevos valores de dimensión, y devuelve int (1 si tiene éxito, 0 si alguna dimensión es negativa o cero)
    Usa protectores de inclusión con el símbolo BOX_H.
  • box.c: Define la struct Box real con tres miembros ocultos: int width, int height y 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 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}
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 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

Practica por tu cuenta: Compilador de C online