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.
Aufgabe
EinfachLassen 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 KlassePlayer, die das Profil eines Spielcharakters mit geschütztem Datenzugriff verwaltet. Ihre 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 — falls ungültig, bleibt der aktuelle Name unverändert - Einen Setter
addExperience(int points), der nur positive Werte akzeptiert. Wenn die Erfahrung100erreicht 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 (immer100 - current experience)
Markieren Sie alle Getter als
const, da sie das Objekt nicht verändern.- Private Member:
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
Playermit 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
- Erstellen Sie einen
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
constmarkiert werden, da sie das Objekt nicht verändern - Setter können nicht
constsein, 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;
}
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 & QuelldateienNamensräume & GültigkeitsbereicheEinführung in OOP in C++Klassen vs. ObjekteDer 'this'-PointerMethoden (Elementfunktionen)Attribute (Datenelemente)Grundlagen zu Ctors & DtorsRückblick - Einfacher Taschenrechner4Klasseneigenschaften
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen & KlassenZusammenfassung - Bankkonto-Manager7Vererbung
Grundlagen der VererbungZugriffsstufen bei VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick - Mitarbeiter-Hierarchie2Speicherverwaltung
Stack vs. Heap SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Smart Pointers in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsspezifizierer in C++Zugriffsspezifizierer im DetailInformation HidingStruct vs. ClassVerschachtelte & innere KlassenRückblick - Studentenverwaltungssystem8Polymorphie
Kompilierzeit- vs. Laufzeit-PolymorphieFunktionsüberladungVirtuelle Funktionen – WiederholungRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIZusammenfassung – Formen-Rechner3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorVerschiebekonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktoren im DetailRule of Three / Five / ZeroZusammenfassung - String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladen der [] und () OperatorenTypumwandlungsoperatorenRückblick - Matrix-Klasse9Templates
FunktionstemplatesKlassentemplatesTemplate-SpezialisierungVariadische TemplatesSFINAE & Type Traits GrundlagenRückblick - Generische Container