Recapitulação: Caixa Secreta
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 21 de 61.
Desafio
FácilVamos criar um módulo Box que demonstra 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 tipoBoxopaco usando apenas uma declaração antecipada: o corpo da struct permanece oculto. Declare estas funções:create_box: recebe três inteiros (largura, altura, profundidade) e retorna um ponteiro para Boxdestroy_box: libera a memória alocadaget_volume: recebe umconst Box *e retorna o volume (largura × altura × profundidade)set_dimensions: recebe um ponteiro para Box e três novos valores de dimensão, e retornaint(1 para sucesso, 0 se alguma dimensão for negativa ou zero)
BOX_H.box.c: defina astruct Boxreal com três membros ocultos:int width,int heighteint depth. Implemente as quatro funções. Seu construtor deve alocar e inicializar a caixa. A funçãoset_dimensionsdeve validar se os três valores são positivos (maiores que zero) antes de aplicar as alterações; se algum valor falhar na validação, rejeite toda a atualização e retorne 0.main.c: demonstre sua Box encapsulada criando uma, verificando seu volume, tentando alterar suas dimensões (tanto com valores válidos quanto inválidos) e realizando a limpeza corretamente.
Você receberá cinco entradas: a largura inicial, a altura inicial, a profundidade inicial, seguidas por três novas dimensões que devem ser definidas (as quais podem incluir valores inválidos).
Em seu arquivo principal, crie uma 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 box e confirme a limpeza.
Imprima a saída neste formato:
Volume: {volume}
Set: {0 or 1}
Volume: {volume}
DestroyedPor exemplo, com as entradas 2, 3, 4, 5, 5, 5, a saída seria:
Volume: 24
Set: 1
Volume: 125
DestroyedCom as entradas 2, 3, 4, -1, 5, 5, a saída seria:
Volume: 24
Set: 0
Volume: 24
DestroyedObserve como a validação em set_dimensions protege sua box 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() {
// Ler dimensões iniciais
int width, height, depth;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &depth);
// Ler novas dimensões a tentar
int new_w, new_h, new_d;
scanf("%d", &new_w);
scanf("%d", &new_h);
scanf("%d", &new_d);
// TODO: Criar um Box com dimensões iniciais
// TODO: Imprimir volume inicial no formato: "Volume: {volume}"
// TODO: Tentar definir novas dimensões e armazenar o resultado
// TODO: Imprimir se a definição foi bem-sucedida no formato: "Set: {0 or 1}"
// TODO: Imprimir o volume resultante no formato: "Volume: {volume}"
// TODO: Destruir o box e imprimir "Destroyed"
return 0;
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do CírculoImplementação do RetânguloUso PolimórficoContainer de FormasPratique por conta própria: Compilador de C online