Menu
CoddyTech

Revisão: caixa secreta

Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 21 de 61.

challenge icon

Desafio

Fácil

Vamos criar um módulo Box que demonstra o encapsulamento completo. Sua caixa terá três dimensões ocultas — largura, altura e profundidade — que só poderão ser acessadas por meio das funções que você fornecer. Este é o padrão completo de ponteiro opaco em ação!

Você criará três arquivos:

  • box.h: sua interface pública. Declare um tipo opaco Box usando apenas uma declaração antecipada: o corpo da struct permanece oculto. Declare estas funções:
    • create_box: recebe três números inteiros (largura, altura, profundidade) e retorna um ponteiro para Box
    • destroy_box: libera a memória alocada
    • get_volume: recebe um const Box * e retorna o volume (largura × altura × profundidade)
    • set_dimensions: recebe um ponteiro para Box e três novos valores de dimensão, e retorna int (1 para sucesso, 0 se qualquer dimensão for negativa ou zero)
    Use guardas de inclusão com o símbolo BOX_H.
  • box.c: defina a struct Box real com três membros ocultos: int width, int height e int depth. Implemente as quatro funções. Seu construtor deve alocar e inicializar a caixa. A função set_dimensions deve validar se os três valores são positivos (maiores que zero) antes de aplicar qualquer alteração. Se algum valor falhar na validação, rejeite toda a atualização e retorne 0.
  • main.c: demonstre seu Box encapsulado criando um, verificando seu volume, tentando alterar suas dimensões (tanto com valores válidos quanto inválidos) e liberando a memória corretamente.

Você receberá cinco entradas: a largura inicial, a altura inicial, a profundidade inicial, seguidas de três novas dimensões para tentar definir (que podem incluir valores inválidos).

No seu arquivo principal, crie um Box com as dimensões iniciais e imprima seu volume. Em seguida, tente definir as novas dimensões: imprima se a atualização foi bem-sucedida e o volume resultante. Por fim, libere a caixa e confirme a limpeza.

Imprima a saída neste formato:

Volume: {volume}
Set: {0 or 1}
Volume: {volume}
Destroyed

Por exemplo, com as entradas 2, 3, 4, 5, 5, 5, a saída seria:

Volume: 24
Set: 1
Volume: 125
Destroyed

Com as entradas 2, 3, 4, -1, 5, 5, a saída seria:

Volume: 24
Set: 0
Volume: 24
Destroyed

Perceba como a validação em set_dimensions protege sua caixa contra estados inválidos: o código externo não pode contornar suas regras porque as dimensões ficam completamente ocultas por trás da sua interface.

Experimente você mesmo

#include <stdio.h>
#include "box.h"

int main() {
    // Leia as dimensões iniciais
    int width, height, depth;
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%d", &depth);
    
    // Leia as novas dimensões para testar
    int new_w, new_h, new_d;
    scanf("%d", &new_w);
    scanf("%d", &new_h);
    scanf("%d", &new_d);
    
    // TODO: Crie uma Box com as dimensões iniciais
    
    
    // TODO: Imprima o volume inicial no formato: "Volume: {volume}"
    
    
    // TODO: Tente definir as novas dimensões e armazene o resultado
    
    
    // TODO: Imprima se a definição foi bem-sucedida no formato: "Set: {0 or 1}"
    
    
    // TODO: Imprima o volume resultante no formato: "Volume: {volume}"
    
    
    // TODO: Destrua a box e imprima "Destroyed"
    
    
    return 0;
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C online