Projektübersicht
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 44 von 61.
Aufgabe
EinfachLege das Fundament für das Shape-Drawer-Projekt, indem du die grundlegende Shape-Struktur erstellst: eine Schnittstelle, die über Funktionszeiger festlegt, was jede Form tun kann.
Du erstellst zwei Dateien, um dieses polymorphe System einzurichten:
shape.h: Definiere hier die zentrale Schnittstelle. Erstelle zunächst eine Vorwärtsdeklaration für dieShape-Struktur. Definiere dann zwei Funktionszeigertypen:DrawFunc: akzeptiert einen Parameter vom Typconst Shape*und gibt nichts zurückAreaFunc: akzeptiert einen Parameter vom Typconst Shape*und gibt einendoublezurück
Shape-Struktur selbst, die zwei Funktionszeiger enthält:draw(vom TypDrawFunc) undarea(vom TypAreaFunc). Diese Struktur dient ausschließlich als Schnittstelle. Sie enthält keine formspezifischen Daten, sondern nur Verhalten.main.c: Zeige, dass deine Schnittstelle funktioniert, indem du eine einfache Testform erstellst. Implementiere zwei Funktionen:test_draw: gibtDrawing test shapeaustest_area: gibt42.0zurück
Shape-Instanz, verknüpfe sie mit diesen Testfunktionen und rufe anschließend beide über die Schnittstelle auf. Gib das Flächenergebnis mit einer Nachkommastelle aus.
Deine Ausgabe sollte zeigen, dass die Funktionszeiger korrekt funktionieren:
Drawing test shape
Area: 42.0Warum die Vorwärtsdeklaration? Du fragst dich vielleicht, warum typedef struct Shape Shape; vor der vollständigen Definition der Struktur steht. Das ist notwendig, weil DrawFunc und AreaFunc in ihren Parametertypen auf const Shape* verweisen, der Compiler zu diesem Zeitpunkt in der Datei aber die vollständige Strukturdefinition noch nicht gesehen hat. Die Vorwärtsdeklaration teilt dem Compiler mit: „Eine Struktur namens Shape existiert“, und das reicht aus, um einen Zeiger darauf zu verwenden. Die vollständige Definition folgt später. Dieses Muster ist in C üblich, wenn eine Struktur auf sich selbst verweisen muss (direkt oder über Funktionszeiger).
Die wichtigste Erkenntnis ist, dass Shape nichts über Kreise oder Rechtecke weiß. Sie weiß nur, dass jede Form sich selbst mit draw zeichnen und ihre area berechnen können muss. In den kommenden Lektionen wirst du konkrete Formen erstellen, die diese grundlegende Struktur einbetten und ihre eigenen Implementierungen bereitstellen. Denke daran, Include-Guards in deiner Header-Datei zu verwenden.
Probier es selbst
#include <stdio.h>
#include "shape.h"
// TODO: Implementiere die test_draw-Funktion
// - Nimmt einen const Shape*-Parameter
// - Prints "Drawing test shape"
void test_draw(const Shape* shape) {
// TODO: Gib die erforderliche Nachricht aus
}
// TODO: Implementiere die test_area-Funktion
// - Nimmt einen const Shape*-Parameter
// - Gibt 42.0 zurück
double test_area(const Shape* shape) {
// TODO: Gib den Test-Flächenwert zurück
}
int main() {
// TODO: Erstelle eine Shape-Instanz
// TODO: Verbinde die Shape mit den test_draw- und test_area-Funktionen
// TODO: Rufe draw über die Schnittstelle auf
// TODO: Rufe area über die Schnittstelle auf und gib mit einer Dezimalstelle aus
// Format: "Area: %.1f\n"
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