Structs als Objekte
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 6 von 61.
In objektorientierten Sprachen ist ein Objekt eine Entität, die Daten (Zustand) mit Funktionen bündelt, die auf diesen Daten arbeiten (Methoden). C verfügt nicht über integrierte Objekte, aber wir können dasselbe Konzept mithilfe von Strukturen und Funktionen umsetzen.
Stell dir eine Struktur als den „Daten“-Teil eines Objekts vor. Sie enthält den Zustand: die Werte, die festlegen, was das Objekt momentan ist:
typedef struct {
int value;
} Counter;
Diese Counter-Struktur stellt eine Entität mit einem einzigen Zustandswert dar: ihrem aktuellen Wert. Um ihr Verhalten zu geben, schreiben wir Funktionen, die die Struktur als Parameter akzeptieren:
void counter_increment(Counter *c) {
c->value++;
}
int counter_get(Counter *c) {
return c->value;
}
Diese Funktionen verhalten sich wie Methoden. Sie arbeiten speziell mit Counter-Daten. Indem wir die Struktur an Funktionen übergeben, simulieren wir, was andere Sprachen automatisch tun, wenn du counter.increment() aufrufst.
int main() {
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // Gibt aus: 1
return 0;
}
Die Namenskonvention typename_action (wie counter_increment) hilft dabei, deinen Code zu organisieren, und macht deutlich, zu welchem Struct eine Funktion gehört. Dieses Muster bildet die Grundlage der objektorientierten Programmierung in C.
Aufgabe
EinfachErstelle ein einfaches Counter-Modul, das eine Struktur als Objekt mit Verhalten behandelt. Du organisierst deinen Code auf drei Dateien verteilt, um das Muster zu üben, Daten mit Funktionen zu bündeln, die auf ihnen operieren.
Du erstellst drei Dateien:
counter.h: Deine Header-Datei, die die StrukturCountermit einem einzelnen Elementint valuedeklariert. Deklariere außerdem zwei Funktionen, die als „Methoden“ für den Zähler dienen:counter_increment(erhält einen Zeiger auf Counter und erhöht dessen Wert um 1) undcounter_get(erhält einen Zeiger auf Counter und gibt dessen aktuellen Wert zurück). Verwende Include-Guards mit dem SymbolCOUNTER_H.counter.c: Deine Quelldatei, die beide Funktionen implementiert. Denke daran, deine Header-Datei einzubinden.main.c: Deine Hauptdatei, die einen Counter erstellt, Operationen daran ausführt und die Ergebnisse anzeigt.
Du erhältst zwei ganzzahlige Eingaben: den Startwert für deinen Zähler und die Anzahl der Erhöhungen.
Initialisiere in deiner Hauptdatei einen Counter mit dem Startwert und rufe anschließend counter_increment so oft wie angegeben auf. Verwende schließlich counter_get, um den Endwert abzurufen und auszugeben.
Gib das Ergebnis in diesem Format aus:
Final value: {result}Beispielsweise würde die Ausgabe bei einem Startwert von 5 und 3 Erhöhungen wie folgt aussehen:
Final value: 8Probier es selbst
#include <stdio.h>
#include "counter.h"
int main() {
// Eingabe lesen
int starting_value;
int num_increments;
scanf("%d", &starting_value);
scanf("%d", &num_increments);
// TODO: Erstelle einen Counter und initialisiere ihn mit starting_value
// TODO: Rufe counter_increment die angegebene Anzahl von Malen auf
// TODO: Verwende counter_get, um den Endwert abzurufen und ihn auszugeben
// Ausgabeformat: "Final value: {result}"
return 0;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
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