Klassenzeiger
-
Hallo,
entschuldigt, wenn die Frage bereits gestellt wurde aber ich hatte mit SuFu nichts gefunden.Mich interessiert wann und warum man eine Klasse als Zeiger initialisieren muss.
Also nach der Art:
MyClass* Klasse
Ich habe das bereits in vielen Tutorials gesehen aber nirgends wird erklärt warum es so gemacht wird.Danke für eure Antwort.
Ps: Bin der Neue schön hier zu sein

-
Hallo,
Man muss das so machen, wenn die Klasse zu diesem Zeitpunkt zwar deklariert, jedoch nicht definiert wurde. Da man nur einen Zeiger auf die Klasse deklariert, muss kein Speicher für das Objekt erstellt werden. Willst du allerdings eine Instanz einer Klasse erzeugen, muss die Größe der Klasse zu diesem Zeitpunkt bekannt sein.
Hier ein Beispiel:class A; class B { private: A* Obj; // Größe von A unbekannt }; class A { private: B Obj; // Hier kann eine Instanz erzeugt werden, da die Größe von B bekannt ist. };Kannst ja mal nach rekursiven Datenstrukturen suchen, da braucht man das auch.
MfG, Jochen
-
Also ist der einzige Unterschied in der Initialisierung?
Danach kann man sie wie jede andere Klasse verwenden
oder gibt es irgendetwas was man ansonsten noch beachten muss?
-
Leswile schrieb:
Also ist der einzige Unterschied in der Initialisierung?
Danach kann man sie wie jede andere Klasse verwenden
oder gibt es irgendetwas was man ansonsten noch beachten muss?Vorwärtsdeklarierte Klassen haben folgende Restriktionen:
- Du kannst keine Instanz erstellen (auch mit new nicht)
- Du kannst keine Member-Funktionen aufrufen
- Du kannst auf keine Member zugreifen
- Du kannst keine Referenzen auf diese Klasse nutzenDies geht alles erst, wenn die Definition der Klasse bekannt ist.
-
Du kannst mit Zeigern auch virtuell arbeiten (was das ist, erkläre ich zu dieser späten Stunde nicht mehr).
Außerdem kannst du damit in einer Klasse ein Element derselben Klasse speichern (was auch schon aus Jochens Beitrag hervorging), damit kannst du z.B. Baumstrukturen erstellen.
-
Vor allem legt man auch Objekte per new auf dem 'free store' an, damit sie länger als der aktuelle Gültigkeitsbereich leben.
void foo() { myclass * A = new myclass; myclass B; ... } // B wird automatisch gelöscht. Die Instanz, auf die A zeigte lebt noch.Das Objekt liegt im Speicher bis es explizit mit
deletegelöscht wird.
Und zu beachten ist, dass gerade Anfänger viel zu häufig mit Zeigern rumhantieren obwohl es überhaupt nicht nötig ist.
-
Janjan schrieb:
...
- Du kannst keine Referenzen auf diese Klasse nutzenDies geht alles erst, wenn die Definition der Klasse bekannt ist.
Referenzen kannst du ebenfalls soweit benutzen, wie es mit Zeigern geht.
@Leswile
Zeiger kannst du auch sonst bei Gelegenheiten benutzen. Z.b wenn du eine Auswahl von Instanzen hast und auf eine Verweisen willst.A a1 (/*parameter*/; A a2 (/*parameter*/); A* a = 0; switch (user_input) { case 0: a = &a1; break; case 1: a = &a2; break; //... } a->foo();