Riepilogo: scatola segreta
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 21 di 61.
Sfida
FacileCostruiamo un modulo Box che dimostri l'incapsulamento completo. La tua scatola avrà tre dimensioni nascoste, larghezza, altezza e profondità, a cui si potrà accedere solo tramite le funzioni che fornisci. Ecco il modello del puntatore opaco in azione!
Creerai tre file:
box.h: la tua interfaccia pubblica. Dichiara un tipo opacoBoxusando solo una dichiarazione anticipata: il corpo della struct rimane nascosto. Dichiara queste funzioni:create_box: accetta tre interi (larghezza, altezza, profondità) e restituisce un puntatore a Boxdestroy_box: libera la memoria allocataget_volume: accetta unconst Box *e restituisce il volume (larghezza × altezza × profondità)set_dimensions: accetta un puntatore a Box e tre nuovi valori per le dimensioni, restituisceint(1 in caso di successo, 0 se una qualsiasi dimensione è negativa o zero)
BOX_H.box.c: definisci lastruct Boxeffettiva con tre membri nascosti:int width,int heighteint depth. Implementa tutte e quattro le funzioni. Il costruttore deve allocare e inizializzare la scatola. La funzioneset_dimensionsdeve verificare che tutti e tre i valori siano positivi (maggiori di zero) prima di applicare eventuali modifiche; se un qualsiasi valore non supera la verifica, rifiuta l'intero aggiornamento e restituisci 0.main.c: mostra il tuo Box incapsulato creandone uno, controllandone il volume, provando a modificarne le dimensioni (sia con valori validi che non validi) e liberando correttamente la memoria.
Riceverai cinque input: la larghezza iniziale, l'altezza iniziale, la profondità iniziale, seguite da tre nuove dimensioni da provare a impostare (che potrebbero includere valori non validi).
Nel file principale, crea un Box con le dimensioni iniziali e stampa il suo volume. Poi prova a impostare le nuove dimensioni: stampa se l'aggiornamento è riuscito e il volume risultante. Infine, libera la scatola e conferma la pulizia.
Stampa l'output in questo formato:
Volume: {volume}
Set: {0 or 1}
Volume: {volume}
DestroyedAd esempio, con gli input 2, 3, 4, 5, 5, 5, l'output sarebbe:
Volume: 24
Set: 1
Volume: 125
DestroyedCon gli input 2, 3, 4, -1, 5, 5, l'output sarebbe:
Volume: 24
Set: 0
Volume: 24
DestroyedNota come la verifica in set_dimensions protegga la tua scatola dagli stati non validi: il codice esterno non può aggirare le tue regole perché le dimensioni sono completamente nascoste dietro la tua interfaccia.
Provalo tu
#include <stdio.h>
#include "box.h"
int main() {
// Leggi le dimensioni iniziali
int width, height, depth;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &depth);
// Leggi le nuove dimensioni da provare
int new_w, new_h, new_d;
scanf("%d", &new_w);
scanf("%d", &new_h);
scanf("%d", &new_d);
// TODO: Crea un Box con le dimensioni iniziali
// TODO: Stampa il volume iniziale nel formato: "Volume: {volume}"
// TODO: Prova a impostare le nuove dimensioni e memorizza il risultato
// TODO: Stampa se l'impostazione è riuscita nel formato: "Set: {0 or 1}"
// TODO: Stampa il volume risultante nel formato: "Volume: {volume}"
// TODO: Distruggi il box e stampa "Destroyed"
return 0;
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online