Menu
Coddy logo textTech

Getter und Setter

Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy — Lektion 28 von 104.

Wenn Klassenmember privat sind, kann externer Code nicht direkt auf sie zugreifen. Getter und Setter sind öffentliche Methoden, die einen kontrollierten Zugriff auf diese privaten Member ermöglichen – Getter rufen Werte ab, Setter ändern sie.

class Temperature {
    double celsius;    // Privat - kann nicht direkt zugegriffen werden
    
public:
    // Getter - gibt den Wert zurück
    double getCelsius() const {
        return celsius;
    }
    
    // Setter - ändert den Wert mit Validierung
    void setCelsius(double value) {
        if (value >= -273.15) {    // Überprüfung des absoluten Nullpunkts
            celsius = value;
        }
    }
};

Die wahre Stärke von Settern ist die Validierung.

Anstatt die Zuweisung beliebiger Werte zuzulassen, können Sie Regeln erzwingen. Im obigen Beispiel werden Temperaturen unter dem absoluten Nullpunkt abgelehnt. Ohne einen Setter könnte jeder ungültige Daten direkt zuweisen.

Getter können Daten auch transformieren, bevor sie diese zurückgeben:

class Temperature {
    double celsius;
public:
    double getCelsius() const { return celsius; }
    
    // Berechneter Getter - speichert Fahrenheit nicht, sondern berechnet es
    double getFahrenheit() const {
        return celsius * 9.0 / 5.0 + 32.0;
    }
    
    void setCelsius(double value) { celsius = value; }
};

Beachten Sie das Schlüsselwort const bei Gettern – dies zeigt an, dass sie das Objekt nicht verändern. Setter können nicht const sein, da ihr Zweck darin besteht, Member-Werte zu ändern. Dieses Muster der Verwendung von Gettern und Settern ist grundlegend für die Kapselung und gibt Ihnen die volle Kontrolle darüber, wie auf Ihre Klassendaten zugegriffen wird und wie diese geändert werden.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Spielerprofil-System erstellen, das zeigt, wie Getter und Setter einen kontrollierten Zugriff auf private Daten ermöglichen, einschließlich Validierung und berechneter Eigenschaften.

Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:

  • Player.h: Definieren Sie eine Klasse Player, die das Profil eines Spielcharakters mit geschütztem Datenzugriff verwaltet. Ihre Klasse sollte Folgendes enthalten:
    • Private Member: name (string), level (int) und experience (int)
    • Einen Konstruktor, der einen Namen entgegennimmt und level auf 1 sowie experience auf 0 initialisiert
    • Einen Getter getName(), der den Namen des Spielers zurückgibt
    • Einen Getter getLevel(), der das aktuelle Level zurückgibt
    • Einen Getter getExperience(), der die aktuellen Erfahrungspunkte zurückgibt
    • Einen Setter setName(), der nur Namen mit mindestens 3 Zeichen akzeptiert — falls ungültig, bleibt der aktuelle Name unverändert
    • Einen Setter addExperience(int points), der nur positive Werte akzeptiert. Wenn die Erfahrung 100 erreicht oder überschreitet, steigt der Spieler ein Level auf: Erhöhen Sie das Level um 1 und ziehen Sie 100 von der Erfahrung ab. Dies kann mehrfach geschehen, wenn genügend Erfahrung hinzugefügt wird.
    • Einen berechneten Getter getExperienceToNextLevel(), der zurückgibt, wie viele Erfahrungspunkte noch benötigt werden, um das nächste Level zu erreichen (immer 100 - current experience)

    Markieren Sie alle Getter als const, da sie das Objekt nicht verändern.

  • main.cpp: Demonstrieren Sie Ihre Getter und Setter in Aktion. Lesen Sie einen Spielernamen und die hinzuzufügenden Erfahrungspunkte von der Eingabe ein (jeweils in einer separaten Zeile) und führen Sie dann Folgendes aus:
    • Erstellen Sie einen Player mit dem eingegebenen Namen
    • Geben Sie "Player: <name>, Level: <level>, XP: <experience>" aus
    • Fügen Sie die eingegebenen Erfahrungspunkte mit addExperience() hinzu
    • Geben Sie dieselbe Statuszeile erneut aus, um den aktualisierten Zustand anzuzeigen
    • Geben Sie "XP to next level: <amount>" aus
    • Versuchen Sie, den Namen in "Al" zu ändern (sollte an der Validierung scheitern)
    • Geben Sie "Name after invalid change: <name>" aus
    • Ändern Sie den Namen in "Champion" (sollte erfolgreich sein)
    • Geben Sie "Name after valid change: <name>" aus

Die Eingabe für die Erfahrung wird als String bereitgestellt, den Sie in einen Integer umwandeln müssen. Binden Sie Ihre Header-Datei in main.cpp mit #include "Player.h" ein.

Spickzettel

Getter und Setter sind öffentliche Methoden, die einen kontrollierten Zugriff auf private Klassenmitglieder ermöglichen.

Grundlegendes Getter- und Setter-Muster:

class Temperature {
    double celsius;    // Privates Mitglied
    
public:
    // Getter - gibt den Wert zurück (als const markiert)
    double getCelsius() const {
        return celsius;
    }
    
    // Setter - ändert den Wert
    void setCelsius(double value) {
        celsius = value;
    }
};

Setter mit Validierung:

void setCelsius(double value) {
    if (value >= -273.15) {    // Vor dem Setzen validieren
        celsius = value;
    }
}

Berechnete Getter:

// Gibt den berechneten Wert zurück, ohne ihn zu speichern
double getFahrenheit() const {
    return celsius * 9.0 / 5.0 + 32.0;
}

Wichtige Punkte:

  • Getter sollten als const markiert werden, da sie das Objekt nicht verändern
  • Setter können nicht const sein, da sie die Werte der Mitglieder ändern
  • Setter ermöglichen eine Validierung, um ungültige Daten zu verhindern
  • Getter können Werte transformieren oder berechnen, bevor sie zurückgegeben werden

Probier es selbst

#include <iostream>
#include <string>
#include "Player.h"

using namespace std;

int main() {
    // Spielernamen einlesen
    string playerName;
    getline(cin, playerName);

    // Hinzuzufügende Erfahrungspunkte einlesen (als String, in int umwandeln)
    string expString;
    getline(cin, expString);
    int expToAdd = stoi(expString);

    // TODO: Erstelle einen Player mit dem eingegebenen Namen

    // TODO: Gib den Anfangsstatus aus: "Player: <name>, Level: <level>, XP: <experience>"

    // TODO: Füge die eingegebenen Erfahrungspunkte mit addExperience() hinzu

    // TODO: Gib die aktualisierte Statuszeile aus

    // TODO: Gib "XP to next level: <amount>" aus

    // TODO: Versuche, den Namen in "Al" zu ändern (Validierung sollte fehlschlagen)

    // TODO: Gib "Name after invalid change: <name>" aus

    // TODO: Ändere den Namen in "Champion" (sollte erfolgreich sein)

    // TODO: Gib "Name after valid change: <name>" 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