In C++ scheint keine Syntax vorgesehen zu sein, mit der ohne die
Benutzung einer Instanz direkt auf ein nichtstatisches Element einer
Klasse zuzugriffen werden kann.
Normalerweise ist es ja auch wenig sinnvoll auf etwas zuzugreifen, was
gar nicht existiert. Einen Sonderfall stellen die Operatoren typeof
und sizeof dar, da diese nicht das Element selbst, sondern nur dessen
Eigenschaften (Typ bzw. Größe) kennen müssen. Aber nur für diese beiden
Operatoren wollten die C++-Entwickler wohl kein eigenes Sprachkonstrukt
definieren.
Wenn innerhalb der Klassendeklaration von A (aber außerhalb der
Definition von Elementfunktionen) der nichtglobale Indentifier B
auftaucht, ist B nichts anderes als die Abkürzung für A::B, und A::B ist
nun einmal die Syntax für den Zugriff auf ein statisches Datenelement
der Klasse.
Immerhin gibt einen Hack, mit dem man das Problem zumindest teilweise
umgehen kann: Man definiert eine Pseudoinstanz von A an der Adresse 0
(oder sonstwo). Da auf die Instanz nicht wirklich zugegriffen wird, ist
das in Ordnung, wenn auch unschön:
bzw.
Der Hack funktioniert aber nur außerhalb der Klassendeklaration von A.
Versucht man, ihn innerhalb der Klassendeklaration anzuwenden, meckert
der GCC schon wieder:
1 | error: invalid use of incomplete type ‘class A’
|
was ebenfalls schwer nachzuvollziehen ist, da er zur Bestimmung der
Eigenschaften von B ja nicht die gesamte Klasse kennen muss.
Wahrscheinlich hängt das damit zusammen, dass der Compiler erst dann mit
Instanzen umgehen kann, wenn die zugehörige Klasse als Ganzes bekannt
ist.
Das sind bei weitem nicht die einzigen Fälle, wo die Sprachdefinition
von C++ etwas krumm ist. Java und C# sind in dieser Hinsicht sicher
sauberer definiert (man hat ja hoffentlich dazugelernt).Trotzdem ist C++
in meinen Augen nach wie vor die beste Vereinigung der C-Philosophie
(Hardwarenähe, Determinismus usw.) und der objektorientierten
Programmierung.