Rückblick: Die geheime Box
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 21 von 61.
Aufgabe
EinfachLass uns ein Box-Modul erstellen, das vollständige Kapselung demonstriert. Deine Box wird drei verborgene Dimensionen haben: Breite, Höhe und Tiefe, auf die nur über die von dir bereitgestellten Funktionen zugegriffen werden kann. Hier kommt das vollständige Muster des opaken Zeigers zum Einsatz!
Du wirst drei Dateien erstellen:
box.h: Deine öffentliche Schnittstelle. Deklariere einen opaken TypBox, indem du ausschließlich eine Vorwärtsdeklaration verwendest: Der Struct-Body bleibt verborgen. Deklariere diese Funktionen:create_box: übernimmt drei Ganzzahlen (Breite, Höhe, Tiefe) und gibt einen Box-Zeiger zurückdestroy_box: gibt den reservierten Speicher freiget_volume: übernimmt einconst Box *und gibt das Volumen zurück (Breite × Höhe × Tiefe)set_dimensions: übernimmt einen Box-Zeiger und drei neue Dimensionswerte und gibtintzurück (1 bei Erfolg, 0, wenn eine Dimension negativ oder null ist)
BOX_H.box.c: Definiere die tatsächlichestruct Boxmit drei verborgenen Membern:int width,int heightundint depth. Implementiere alle vier Funktionen. Dein Konstruktor sollte die Box reservieren und initialisieren. Die Funktionset_dimensionsmuss überprüfen, dass alle drei Werte positiv (größer als null) sind, bevor sie Änderungen anwendet. Wenn ein Wert die Validierung nicht besteht, lehne die gesamte Aktualisierung ab und gib 0 zurück.main.c: Demonstriere deine gekapselte Box, indem du eine erstellst, ihr Volumen überprüfst, Dimensionsänderungen versuchst (sowohl gültige als auch ungültige) und anschließend ordnungsgemäß aufräumst.
Du erhältst fünf Eingaben: die anfängliche Breite, die anfängliche Höhe, die anfängliche Tiefe, gefolgt von drei neuen Dimensionen, deren Setzen versucht werden soll (sie können ungültige Werte enthalten).
Erstelle in deiner Hauptdatei eine Box mit den anfänglichen Dimensionen und gib ihr Volumen aus. Versuche anschließend, die neuen Dimensionen zu setzen: Gib aus, ob die Aktualisierung erfolgreich war, sowie das resultierende Volumen. Gib die Box schließlich frei und bestätige die Bereinigung.
Gib die Ausgabe in diesem Format aus:
Volume: {volume}
Set: {0 or 1}
Volume: {volume}
DestroyedBei den Eingaben 2, 3, 4, 5, 5, 5 würde die Ausgabe beispielsweise so aussehen:
Volume: 24
Set: 1
Volume: 125
DestroyedBei den Eingaben 2, 3, 4, -1, 5, 5 würde die Ausgabe so aussehen:
Volume: 24
Set: 0
Volume: 24
DestroyedBeachte, wie die Validierung in set_dimensions deine Box vor ungültigen Zuständen schützt: Externer Code kann deine Regeln nicht umgehen, weil die Dimensionen vollständig hinter deiner Schnittstelle verborgen sind.
Probier es selbst
#include <stdio.h>
#include "box.h"
int main() {
// Initiale Dimensionen einlesen
int width, height, depth;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &depth);
// Neue Dimensionen zum Versuch einlesen
int new_w, new_h, new_d;
scanf("%d", &new_w);
scanf("%d", &new_h);
scanf("%d", &new_d);
// TODO: Erstelle eine Box mit den initialen Dimensionen
// TODO: Gib das initiale Volumen im Format aus: "Volume: {volume}"
// TODO: Versuche, die neuen Dimensionen zu setzen und speichere das Ergebnis
// TODO: Gib aus, ob das Setzen erfolgreich war im Format: "Set: {0 or 1}"
// TODO: Gib das resultierende Volumen im Format aus: "Volume: {volume}"
// TODO: Zerstöre die Box und gib "Destroyed" aus
return 0;
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-ImplementierungRechteck-ImplementierungPolymorphe VerwendungShape-ContainerÜbe selbstständig: Online-C-Compiler