this-Alternative für statische Membervariablen
-
Man kann ja auf eine Membervariable einer Klasse mit
this->Variablezugreifen. Gibt es sowas ähnliches auch für statische Membervariablen? Denn für die kann man ja logischerweise nicht this benutzen:
class Klasse { private: int zahl; static char zeichen; public: void SetzeWerte (int zahl, char zeichen) { this->zahl=zahl; /*this->zeichen=zeichen geht nicht. Bleibt mir jetzt nur*/ Klasse::zeichen=zeichen //oder gibt es da was anderes? } };
-
Du kannst Klassenname::member benutzen.
-
NES-Spieler schrieb:
Gibt es sowas ähnliches auch für statische Membervariablen? Denn für die kann man ja logischerweise nicht this benutzen:
das darfst du durchaus. der zugriff auf member einer klasse per . oder -> operator unterscheidet nicht zwischen statisch und nicht-statisch.
-
An Optimizer:
Ja, ich weiß. Diese Version hab ich ja schon in meinem Beispiel gehabt. Aber ich würde eben gern wissen, ob es vielleicht noch was anderes gibt? Wenn nein, dann ist das o.k., aber wissen würd ich's gern.An camper:
Ich meine ja nicht außerhalb einer Klasse im Stil vonKlasse objekt; objekt.variable=9;sondern ich würde gern wissen: Gibt es eine Alternative des this-Zeigers für den Zugriff auf statische Variablen, wenn man sich innerhalb der Klasse befindet (und man nicht nur den Variablennamen selbst schreiben will, zum Beispiel, weil eine lokale Variable den gleichen Namen hat)?
-
Meines Wissens nach gibt es sonst keine andere Möglichkeit (in Fällen, wo es nicht reicht, nur den Variablennamen hinzuschreiben).
-
ich verstehe die frage nicht. es gibt letzlich 4 möglichkeiten, klassenmember zu finden:
1. per unqualifizierter member-id
- findet klassenmember nur innerhalb einer memberfunktion, allerdings kann der member durch einen lokale deklaration verdeckt sein.
2. per qualifizierter id
- innerhalb oder ausserhalb einer klasse. allerdings kann eine nichtstatische entität ausserhalb einer memberfunktion nur dazu benutzt werden, einen pointer-auf-member(funktion) zu bilden
3. per . oder -> operator und unqualifiziertzer memberid
- hier kann der member nicht durch lokale deklarationenen verdeckt werden (wohl aber durch redeklaration in einer abgeleiteten klasse)
4. per . oder -> operator und qualifiziertzer memberid
- wie 3. kann aber auch entsprechend auf verdeckte member zugreifen oder ggf. bestimmte mehrdeutigkeiten auflösenclass Klasse { private: int zahl; static char zeichen; public: void SetzeWerte (int zahl, char zeichen) { /* zahl=zahl; */ // 1. findet nicht member zahl nicht, da verdeckt durch funktionsparameter Klasse::zahl=zahl; // 2. this->zahl=zahl; // 3. (*this).zahl=zahl; // 3. this->Klasse::zahl=zahl; // 4. (*this).Klasse::zahl=zahl; // 4. Klasse::zeichen=zeichen; // 2. this->zeichen=zeichen; // 3. (*this).zeichen=zeichen; // 3. this->Klasse::zeichen=zeichen; // 4. (*this).Klasse::zeichen=zeichen; // 4. } };es spielt keinerlei rolle, ob der member dabei statisch ist, oder nicht. nat. hängt das resultat bei einem statischen member nicht wirklich vom objekt- bzw. pointer-argument des operators ab.
-
Oh, o.k., ich habe einen Fehler in meiner Beschreibung gefunden. Natürlich kann man mit this auch auf eine statische Variable zugreifen.
Mein eigentliches Problem kommt zum Vorschein, wenn auch die Funktion statisch ist:class Klasse { private: static char zeichen; public: static void SetzeWert (char zeichen) { //Jetzt geht this->zeichen=zeichen nicht. } };Soweit ich sehe, gibt es wirklich nur die Version
Klasse::zeichen=zeichenaber ich wollte nochmal die Verwirrung auflösen, deshalb diese Antwort hier.
-
Richtig erkannt, statische Methoden haben keinen This-Zeiger und somit bleibt dir da keine andere Wahl.
-
Eine statische Funktion und eine statische Variable, da spielt das individuelle Objekt keine Rolle mehr, sozusagen "Kommunismus" in Reinform, denn alle sind mit Ausnahme ihrer Speicheradresse (this) jederzeit völlig gleich. Damit ist man auf dem Niveau globale Funktion und globale Variable angekommen umhüllt durch einen namespace.
-
Erhard Henkes schrieb:
Damit ist man auf dem Niveau globale Funktion und globale Variable angekommen umhüllt durch einen namespace.
Das stimmt so nicht. Ein Namespace hat keine Bereichsprüfung und kann jederzeit erweitert werden.