Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Lass 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 Typ Score mithilfe 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ück
    • free_score: nimmt einen Score-Zeiger entgegen und gibt den Speicher frei
    • score_get_points: ein Getter, der einen const Score * entgegennimmt und die aktuellen Punkte zurückgibt
    • score_set_points: ein Setter, der einen Score * und eine Ganzzahl entgegennimmt und den Punktewert aktualisiert
    Verwende Include-Guards mit dem Symbol SCORE_H.
  • score.c: Definiere das tatsächliche struct Score mit 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 Getter const-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}
Freed

Bei den Eingaben 100 und 250 würde die Ausgabe beispielsweise so aussehen:

Initial: 100
Updated: 250
Freed

Beachte, 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;
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-C-Compiler