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.
Aufgabe
EinfachErstelle 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 einePlayer-Klasse, die das Profil eines Spielfigurs mit geschütztem Datenzugriff verwaltet. Deine Klasse sollte Folgendes enthalten:- Private Member:
name(String),level(int) undexperience(int) - Einen Konstruktor, der einen Namen entgegennimmt und
levelauf1sowieexperienceauf0initialisiert - 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 Erfahrung100erreicht 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 (immer100 - current experience)
Markiere alle Getter als
const, da sie das Objekt nicht verändern.- Private Member:
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
Playermit 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
- Erstelle einen
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;
}
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 OOP
Externe DateienC++ Build & KompilierungHeader-Dateien & QuelldateienNamespaces & GültigkeitsbereichEinführung in OOP mit C++Klassen vs. ObjekteDer „this“-ZeigerMethoden (Member-Funktionen)Attribute (Datenmember)Grundlagen zu Ctors & DtorsRückblick – Einfacher Taschenrechner4Klassenattribute
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen und -KlassenZusammenfassung – Bankkontoverwaltung7Vererbung
Grundlagen der VererbungZugriffsebenen bei der VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick – Mitarbeiterhierarchie2Speicherverwaltung
Stack- vs. Heap-SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Intelligente Zeiger in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsbezeichner in C++Zugriffsbezeichner im DetailInformationsverbergungStruct vs. KlasseVerschachtelte und innere KlassenWiederholung – Studierendenverwaltungssystem8Polymorphie
Polymorphie zur Compilezeit vs. LaufzeitFunktionsüberladungVirtuelle Funktionen erneut betrachtetRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIRückblick – Shape-Calculator3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorMove-KonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktor im DetailDrei-/Fünf-/Null-RegelZusammenfassung – String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladung der Operatoren [] und ()TypkonvertierungsoperatorenWiederholung – Matrix-Klasse9Templates
FunktionstemplatesKlassen-TemplatesTemplate-SpezialisierungVariadische TemplatesGrundlagen zu SFINAE und Type TraitsRückblick – Generischer ContainerÜbe selbstständig: Online-C++-Compiler