Structs als Objekte
Teil des Abschnitts Object Oriented Programming 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 operieren (Methoden). C hat keine eingebauten Objekte, aber wir können dasselbe Konzept mit Structs und Funktionen erreichen.
Stellen Sie sich ein Struct als den „Daten“-Teil eines Objekts vor. Es hält den Zustand – die Werte, die definieren, was das Objekt aktuell ist:
typedef struct {
int value;
} Counter;
Diese Counter-Struktur repräsentiert eine Entität mit einem einzigen Zustand: ihrem aktuellen Wert. Um ihr Verhalten zu verleihen, 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 operieren speziell auf Counter-Daten. Indem wir das Struct an Funktionen übergeben, simulieren wir das, was andere Sprachen automatisch tun, wenn man counter.increment() aufruft.
int main() {
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // Gibt aus: 1
return 0;
}
Die Benennungskonvention typename_action (wie counter_increment) hilft dabei, Ihren Code zu organisieren und macht deutlich, zu welchem Struct eine Funktion gehört. Dieses Muster ist die Grundlage der objektorientierten Programmierung in C.
Aufgabe
EinfachLassen Sie uns ein einfaches Counter-Modul bauen, das ein Struct wie ein Objekt mit Verhalten behandelt. Sie werden Ihren Code auf drei Dateien aufteilen, um das Muster der Bündelung von Daten mit Funktionen, die darauf operieren, zu üben.
Sie werden drei Dateien erstellen:
counter.h: Ihre Header-Datei, die dasCounter-Struct mit einem einzelnenint value-Member deklariert. Deklarieren Sie außerdem zwei Funktionen, die als „Methoden“ für den Zähler fungieren:counter_increment(nimmt einen Zeiger auf Counter entgegen und erhöht dessen Wert um 1) undcounter_get(nimmt einen Zeiger auf Counter entgegen und gibt dessen aktuellen Wert zurück). Verwenden Sie Include-Guards mit dem SymbolCOUNTER_H.counter.c: Ihre Quelldatei, die beide Funktionen implementiert. Denken Sie daran, Ihre Header-Datei einzubinden.main.c: Ihre Hauptdatei, die einen Counter erstellt, Operationen darauf ausführt und die Ergebnisse anzeigt.
Sie erhalten zwei Ganzzahl-Eingaben: den Startwert für Ihren Zähler und die Anzahl der Male, die er inkrementiert werden soll.
Initialisieren Sie in Ihrer Hauptdatei einen Counter mit dem Startwert und rufen Sie dann counter_increment so oft wie angegeben auf. Verwenden Sie schließlich counter_get, um den Endwert abzurufen und auszugeben.
Geben Sie das Ergebnis in diesem Format aus:
Final value: {result}Zum Beispiel wäre bei einem Startwert von 5 und 3 Inkrementen die Ausgabe:
Final value: 8Spickzettel
In C können wir die objektorientierte Programmierung simulieren, indem wir Structs (Daten) mit Funktionen (Verhalten) kombinieren, die auf diesen Structs operieren.
Definieren Sie ein Struct, um den Zustand zu speichern:
typedef struct {
int value;
} Counter;
Erstellen Sie Funktionen, die als „Methoden“ fungieren, indem sie das Struct als Parameter akzeptieren:
void counter_increment(Counter *c) {
c->value++;
}
int counter_get(Counter *c) {
return c->value;
}
Verwenden Sie das Struct und die Funktionen zusammen:
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // Gibt aus: 1
Die Namenskonvention typename_action (z. B. counter_increment) hilft dabei, den Code zu organisieren und zu verdeutlichen, auf welchem Struct eine Funktion operiert.
Probier 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 so oft wie angegeben auf
// TODO: Verwende counter_get, um den Endwert abzurufen und 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 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