Wozu sind getter & setter bei C++?
Ich besitze 2 Bücher über C++ und schaue mir einige Youtube videos an & überall wird getter und setter benutzt aber nirgends erklärt wozu. Was soll das sein?
Ich nehme jetzt mal einen Ausschnitt aus meinem Buch:
class Automat {
unsigned long geld;
string standort;
unsigned long get_geld();
void set_geld(unsigned long g);
string& get_standort();
void set_standort(string& s);
void init(unsigned long g, string s); };
4 Antworten
Hat mehrer Gründe:
zB. Informationen die der Client (Nutzer deiner Klasse) nicht zu kennen braucht zu "verstecken"... So kann er sich auf das Wesentliche konzentrieren.
Stell dir so eine Klasse wie z.B. einen Toaster vor. Du packst was rein, dann passiert was und du bekommst wieder etwas raus... Mehr willst du dich mit dem Ding als Entwickler nicht auseinander setzen müssen.
Ein anderer Anwendungsfall wäre die Werte die gesetzt werden zu validieren. Das kannst du nicht wenn du dem Anwender das Setzen der Werte überlässt.
Member sollten NIE öffentlich sein.
Erm und noch eine Kleinigkeit, wenn das von dir gegebene Beispiel wirklich so in dem Buch steht, nimm dir ein anderes zur Hand ;)
Hat für mich zwei große Vorteile:
Falls eine Variable geändert wird kann man im CallStack nachsehen von wo sie geändert worden ist, wenn die Variable public ist und diese geändert wird sieht man nirgendwo, meines Wissens nach, woher.
Du kannst zum Beispiel beim setter den übergebenen Wert prüfen. Nehmen wir mal an du hast eine Klasse namens DegreeCelsius mit einer Funktion SetTemperature(float _degreeCelsius). Nun kannst du in der Funktion prüfen ob der übergebene Wert kleiner als -273,15°C ist, also der Absolute Nullpunkt, ist und ggf. korrigieren, einen Fehler ausgeben oder worauf du lustig bist. Oder ob der Pointer != nullptr ist, ein gutes Beispiel dürfte da das Singleton Pattern sein.
Getter geben einfach die jeweilige Variable zurück. Zb getV() {return v;}. Setter beschreiben eine Variable. Zb setV(typ pV) {v = pV;}. Insofern nützlich, wenn andere Klassen auf die jeweilige Variable zugreifen will, welche man ja normalerweise als private definiert. Man kann die auch public stellen und sie dann direkt manipulieren, scheint aber gegen das Prinzip von geschlossenen Klassen zu gehen, also der Objektorientierung, weshalb man wohl eher zu gestern und settern greift. Das war mal ganz kurz und allgemein erklärt
dass man auf member variable nicht direkt zugreifen soll ist eine Ideologie der OO-Puristen. vergiss es.
https://de.wikipedia.org/wiki/Zugriffsfunktion
PS: Normalerweise sollten die accessor public sein...