Menu
Coddy logo textTech

Projektübersicht

Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 44 von 61.

challenge icon

Aufgabe

Einfach

Lege 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 die Shape-Struktur. Definiere dann zwei Funktionszeigertypen:
    • DrawFunc: akzeptiert einen Parameter vom Typ const Shape* und gibt nichts zurück
    • AreaFunc: akzeptiert einen Parameter vom Typ const Shape* und gibt einen double zurück
    Definiere schließlich die Shape-Struktur selbst, die zwei Funktionszeiger enthält: draw (vom Typ DrawFunc) und area (vom Typ AreaFunc). 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: gibt Drawing test shape aus
    • test_area: gibt 42.0 zurück
    Erstelle eine 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.0

Warum 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

Übe selbstständig: Online-C-Compiler