Getter und Setter
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 19 von 61.
Bei opaken Zeigern sind die Mitglieder der Struktur vor Code außerhalb verborgen. Aber wenn externer Code nicht direkt auf die Daten zugreifen kann, wie lesen oder ändern wir sie? Die Antwort sind Getter- und Setter-Funktionen: öffentliche Schnittstellen, die kontrollierten Zugriff auf private Daten ermöglichen.
Ein getter gibt den Wert eines verborgenen member zurück:
// counter.h
int counter_get_value(const Counter *c);
// counter.c
int counter_get_value(const Counter *c) {
return c->value;
}
Ein Setter ändert ein verborgenes member:
// counter.h
void counter_set_value(Counter *c, int new_value);
// counter.c
void counter_set_value(Counter *c, int new_value) {
c->value = new_value;
}
Beachte die Namenskonvention: Stelle Funktionsnamen den Typnamen (counter_) voran, um Konflikte zu vermeiden und die API übersichtlich zu gestalten. Getter verwenden const-Pointer, da sie das Objekt nicht verändern.
Jetzt kann externer Code sicher mit den verborgenen Daten interagieren:
// main.c
Counter *c = create_counter(10);
printf("%d\n", counter_get_value(c)); // 10
counter_set_value(c, 25);
printf("%d\n", counter_get_value(c)); // 25
Dieses pattern gibt dir vollständige Kontrolle darüber, wie auf Daten zugegriffen wird: eine Grundlage, auf der wir in der nächsten Lektion aufbauen, wenn wir Validierungslogik zu Settern hinzufügen.
Aufgabe
EinfachLass uns ein Score-Modul erstellen, das das Muster des undurchsichtigen Zeigers mit Getter- und Setter-Funktionen verwendet. Du erstellst eine verborgene Punktestandsverwaltung, mit der externer Code nur über die von dir bereitgestellte öffentliche Schnittstelle interagieren kann.
Du erstellst drei Dateien:
score.h: Deine öffentliche Schnittstelle. Deklariere einen undurchsichtigen TypScoremithilfe einer Vorwärtsdeklaration (keinen Struct-Körper!). Deklariere diese Funktionen:create_score: nimmt eine Ganzzahl für die anfänglichen Punkte entgegen und gibt einen Score-Zeiger zurückfree_score: nimmt einen Score-Zeiger entgegen und gibt den Speicher freiscore_get_points: ein Getter, der einenconst Score *entgegennimmt und die aktuellen Punkte zurückgibtscore_set_points: ein Setter, der einenScore *und eine Ganzzahl entgegennimmt und den Punktewert aktualisiert
SCORE_H.score.c: Definiere das tatsächlichestruct Scoremit einem einzigen verborgenen Member:int points. Implementiere alle vier Funktionen. Dein Getter sollte den verborgenen Wert zurückgeben, und dein Setter sollte ihn aktualisieren. Denke daran, dass Getterconst-Zeiger verwenden, da sie das Objekt nicht verändern.main.c: Zeige die Verwendung deines Moduls, indem du einen Punktestand erstellst, seinen Wert ausliest, ihn über den Setter änderst und ihn anschließend erneut ausliest.
Du erhältst zwei Eingaben: die anfänglichen Punkte (eine Ganzzahl) und den neuen Punktewert (eine Ganzzahl), der gesetzt werden soll.
Erstelle in deiner Hauptdatei einen Score mit den anfänglichen Punkten, gib den aktuellen Wert mithilfe des Getters aus, aktualisiere ihn mithilfe des Setters mit dem neuen Wert, gib den aktualisierten Wert aus, gib anschließend den Score frei und gib eine Bestätigung aus.
Gib die Ausgabe in diesem Format aus:
Initial: {points}
Updated: {points}
FreedBei den Eingaben 100 und 250 würde die Ausgabe beispielsweise so aussehen:
Initial: 100
Updated: 250
FreedBeachte, dass main.c nicht direkt auf points zugreifen kann. Es muss deine Getter- und Setter-Funktionen verwenden. Das ist Kapselung in Aktion: Du bestimmst genau, wie die verborgenen Daten gelesen und geändert werden können.
Probier es selbst
#include <stdio.h>
#include "score.h"
int main() {
int initial_points, new_points;
scanf("%d", &initial_points);
scanf("%d", &new_points);
// TODO: Erstelle einen Score mit initial_points
// TODO: Gib den Anfangswert mit dem Getter aus
// Format: "Initial: {points}"
// TODO: Aktualisiere den Score mit dem Setter und new_points
// TODO: Gib den aktualisierten Wert mit dem Getter aus
// Format: "Updated: {points}"
// TODO: Gib den Score frei und gib "Freed" aus
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