Kreis-Implementierung
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 45 von 61.
Aufgabe
EinfachLassen Sie uns das Shape Drawer-Projekt weiter ausbauen, indem wir den Circle implementieren — eine konkrete Form, die das Basis-Shape-Struct einbettet und ihre eigene Zeichen- und Flächenlogik bereitstellt.
Aufbauend auf der Grundlage der vorherigen Lektion werden Sie Ihr Projekt um diese Dateien erweitern:
shape.h: Behalten Sie Ihr Basis-Shape-Interface aus der vorherigen Lektion mit den FunktionszeigertypenDrawFuncundAreaFuncbei.circle.h: Definieren Sie hier IhrCircle-Struct. Ein Kreis bettetShapeals sein erstes Mitglied ein (was die "First Member Rule" für das Upcasting ermöglicht) und fügt einradius-Feld vom Typdoublehinzu. Deklarieren Sie eine Konstruktorfunktioncreate_circle, die einen Radius entgegennimmt und einenCircleals Wert zurückgibt.circle.c: Implementieren Sie hier das kreisspezifische Verhalten:draw_circle— gibtDrawing Circle with radius: X.XXaus (Radius mit 2 Dezimalstellen angezeigt)area_circle— gibt π × radius² zurück (verwenden Sie3.14159für π)create_circle— initialisiert einenCircle, verknüpft die Funktionszeiger des eingebettetenShapeso, dass sie aufdraw_circleundarea_circlezeigen, setzt den Radius und gibt den Kreis zurück
main.c: Bringen Sie alles zusammen. Lesen Sie einen Radiuswert als Eingabe ein, erstellen Sie einen Kreis mit Ihrem Konstruktor und rufen Sie dann sowohldrawals auchareaüber die Funktionszeiger des eingebettetenShapeauf. Geben Sie die Fläche mit 2 Dezimalstellen aus.
Ihr Programm erhält eine Eingabe: einen radius-Wert (als Gleitkommazahl).
Beispielhafte Ausgabe, wenn die Eingabe 5.0 ist:
Drawing Circle with radius: 5.00
Area: 78.54Beispielhafte Ausgabe, wenn die Eingabe 3.5 ist:
Drawing Circle with radius: 3.50
Area: 38.48Die entscheidende Erkenntnis ist, dass Circle ein Shape als erstes Mitglied enthält, sodass Sie auf die Funktionszeiger über circle.base.draw und circle.base.area (oder wie auch immer Sie das eingebettete Mitglied nennen) zugreifen können. Übergeben Sie beim Aufruf dieser Funktionen einen Zeiger auf das Shape-Mitglied. Denken Sie daran, in allen Header-Dateien Include-Guards zu verwenden.
Probier es selbst
#include <stdio.h>
#include "shape.h"
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Erstellen Sie einen Kreis mit create_circle
// TODO: Rufen Sie draw über den Funktionszeiger des eingebetteten Shape auf
// TODO: Rufen Sie area über den Funktionszeiger des eingebetteten Shape auf
// und geben Sie das Ergebnis mit 2 Dezimalstellen aus: "Area: %.2f\n"
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