Rückblick: Die geheime Box
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 21 von 61.
Aufgabe
EinfachLassen Sie uns ein Box-Modul bauen, das vollständige Kapselung demonstriert. Ihre Box wird drei verborgene Dimensionen haben – Breite, Höhe und Tiefe –, auf die nur über die von Ihnen bereitgestellten Funktionen zugegriffen werden kann. Dies ist das vollständige Opaque-Pointer-Pattern in Aktion!
Sie werden drei Dateien erstellen:
box.h: Ihre öffentliche Schnittstelle. Deklarieren Sie einen opakenBox-Typ nur mit einer Vorwärtsdeklaration – der Rumpf des Structs bleibt verborgen. Deklarieren Sie diese Funktionen:create_box— nimmt drei Ganzzahlen (Breite, Höhe, Tiefe) entgegen und gibt einen Box-Pointer zurückdestroy_box— gibt den zugewiesenen Speicher freiget_volume— nimmt einenconst Box *entgegen und gibt das Volumen zurück (Breite × Höhe × Tiefe)set_dimensions— nimmt einen Box-Pointer und drei neue Dimensionswerte entgegen, gibtintzurück (1 für Erfolg, 0 wenn eine Dimension negativ oder Null ist)
BOX_H.box.c: Definieren Sie das eigentlichestruct Boxmit drei verborgenen Elementen:int width,int heightundint depth. Implementieren Sie alle vier Funktionen. Ihr Konstruktor sollte die Box allokieren und initialisieren. Die Funktionset_dimensionsmuss validieren, dass alle drei Werte positiv (größer als Null) sind, bevor Änderungen angewendet werden – wenn ein Wert die Validierung nicht besteht, lehnen Sie die gesamte Aktualisierung ab und geben Sie 0 zurück.main.c: Demonstrieren Sie Ihre gekapselte Box, indem Sie eine erstellen, ihr Volumen überprüfen, Dimensionsänderungen versuchen (sowohl gültige als auch ungültige) und ordnungsgemäß aufräumen.
Sie erhalten fünf Eingaben: die anfängliche Breite, anfängliche Höhe, anfängliche Tiefe, gefolgt von drei neuen Dimensionen, die gesetzt werden sollen (welche ungültige Werte enthalten können).
Erstellen Sie in Ihrer Hauptdatei eine Box mit den Anfangsdimensionen und geben Sie deren Volumen aus. Versuchen Sie dann, die neuen Dimensionen zu setzen – geben Sie aus, ob die Aktualisierung erfolgreich war und das resultierende Volumen. Geben Sie schließlich die Box frei und bestätigen Sie die Bereinigung.
Geben Sie die Ausgabe in diesem Format aus:
Volume: {volume}
Set: {0 or 1}
Volume: {volume}
DestroyedZum Beispiel wäre bei den Eingaben 2, 3, 4, 5, 5, 5 die Ausgabe:
Volume: 24
Set: 1
Volume: 125
DestroyedBei den Eingaben 2, 3, 4, -1, 5, 5 wäre die Ausgabe:
Volume: 24
Set: 0
Volume: 24
DestroyedBeachten Sie, wie die Validierung in set_dimensions Ihre Box vor ungültigen Zuständen schützt – externer Code kann Ihre Regeln nicht umgehen, da die Dimensionen vollständig hinter Ihrer Schnittstelle verborgen sind.
Probier es selbst
#include <stdio.h>
#include "box.h"
int main() {
// Ursprüngliche Dimensionen einlesen
int width, height, depth;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &depth);
// Neue zu versuchende Dimensionen einlesen
int new_w, new_h, new_d;
scanf("%d", &new_w);
scanf("%d", &new_h);
scanf("%d", &new_d);
// TODO: Eine Box mit den ursprünglichen Dimensionen erstellen
// TODO: Ursprüngliches Volumen im Format "Volume: {volume}" ausgeben
// TODO: Versuchen, neue Dimensionen zu setzen und das Ergebnis speichern
// TODO: Ausgeben, ob das Setzen erfolgreich war, im Format "Set: {0 or 1}"
// TODO: Das resultierende Volumen im Format "Volume: {volume}" ausgeben
// TODO: Die Box zerstören und "Destroyed" ausgeben
return 0;
}
Alle Lektionen in Object Oriented Programming
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-Implementierung