Menu
Coddy logo textTech

Getter und Setter

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

Wenn Klassenmitglieder privat sind, kann externer Code nicht direkt auf sie zugreifen. Getter und Setter sind öffentliche Methoden, die kontrollierten Zugriff auf diese privaten Mitglieder 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.

Statt zuzulassen, dass jeder beliebige Wert zugewiesen wird, kannst du Regeln durchsetzen. Im obigen Beispiel werden Temperaturen unterhalb des absoluten Nullpunkts abgelehnt. Ohne einen Setter könnte jeder ungültige Daten direkt zuweisen.

Getter können Daten auch vor der Rückgabe umwandeln:

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

Beachte das Schlüsselwort const bei Gettern – dies zeigt an, dass sie das Objekt nicht ändern. Setter können nicht const sein, da ihr Zweck darin besteht, Memberwerte zu change. Dieses Muster der Verwendung von Gettern und Settern ist grundlegend für die Kapselung und gibt dir vollständige Kontrolle darüber, wie auf deine class-Daten zugegriffen und wie sie geändert werden.

challenge icon

Aufgabe

Einfach

Erstelle ein Spielers профilsystem, das demonstriert, wie Getter und Setter einen kontrollierten Zugriff auf private Daten ermöglichen, einschließlich Validierung und berechneter Eigenschaften.

Du erstellst zwei Dateien, um deinen Code zu organisieren:

  • Player.h: Definiere eine Player-Klasse, die das Profil eines Spielfigurs mit geschütztem Datenzugriff verwaltet. Deine 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; ist der Name ungültig, bleibt der aktuelle Name unverändert
    • Einen Setter addExperience(int points), der nur positive Werte akzeptiert. Sobald die Erfahrung 100 erreicht oder überschreitet, steigt der Spieler ein Level auf: Erhöhe das Level um 1 und ziehe 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)

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

  • main.cpp: Demonstriere deine Getter und Setter in Aktion. Lies einen Spielernamen und hinzuzufügende Erfahrungspunkte aus der Eingabe ein (jeweils in einer eigenen Zeile), und:
    • Erstelle einen Player mit dem eingegebenen Namen
    • Gib "Player: <name>, Level: <level>, XP: <experience>" aus
    • Füge die eingegebenen Erfahrungspunkte mit addExperience() hinzu
    • Gib dieselbe Statuszeile erneut aus, um den aktualisierten Zustand anzuzeigen
    • Gib "XP to next level: <amount>" aus
    • Versuche, den Namen in "Al" zu ändern (sollte an der Validierung scheitern)
    • Gib "Name after invalid change: <name>" aus
    • Ändere den Namen in "Champion" (sollte erfolgreich sein)
    • Gib "Name after valid change: <name>" aus

Die Erfahrungseingabe wird als String bereitgestellt, den du in eine Ganzzahl umwandeln musst. Binde deine Header-Datei in main.cpp mit #include "Player.h" ein.

Probier es selbst

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

using namespace std;

int main() {
    // Spielername lesen
    string playerName;
    getline(cin, playerName);

    // Erfahrungspunkte zum Hinzufügen lesen (als string, in int konvertieren)
    string expString;
    getline(cin, expString);
    int expToAdd = stoi(expString);

    // TODO: Erstelle einen Player mit dem eingegebenen Namen

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

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

    // TODO: Gib die aktualisierte Statuszeile aus

    // TODO: Print "XP to next level: <amount>"

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

    // TODO: Print "Name after invalid change: <name>"

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

    // TODO: Print "Name after valid change: <name>"

    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