Zeiger und Referenzen
-
A a = new A();
geht das denn???
müsste es nicht heißen A *a = new A(); bzw. A* a = new A();?
und a->methode(...); der Aufruf dann sein????
-
@Checker&Murckser:
Stimmt sorry, da hab ich mich vertan!
Korrigiert!
-
Reth schrieb:
@LordJaxom:
Was passiert in Methode a mit o1 und o2 wenn "andereMethode" verlassen wird?Wenn Du die beiden Referenzen nur in methode verwendest kein Problem, da die Methode längst zurückgekehrt ist, wenn andereMethode verlassen wird. Das einzige was schiefgehen könnte ist wenn Du in methode die Adressen der Referenzen nimmst und irgendwo speicherst. Was macht methode denn mit den beiden Referenzen?
Ansonsten macht eine Referenz wohl das was Du meinst dass sie macht

-
Es ist halt immer so ein Kreuz mit den REferenzen, wenn sie nicht richtig erklärt sind. Bei einer Referenz wird in C++ die Adresse des Zielobjektes übergeben (im Assembler ist das eine indirekte Adressierung, und damit 4 Byte).
Gruss Jerry
-
@LordJaxom:
Danke, dann behalt ich mal meine beschriebenen Gedanken zu den Referenzen so bei!@jerry:
Das ist ein Zeiger aber auch, nur dass ich diesem nen neuen Wert zuweisen kann und der Referenz nicht.Ciao
-
@Reth: Der Zeiger ist eine eigenständige Variable, die eine Adresse als Inhalt aufnimmt(Daher veränderbar). Die Referenz wird intern anders dargestellt und ist eine feste Adresse auf das Objekt! Jerry
-
Danke nochmals!
Eine Frage noch:
Kann man denn sowas machen:
void klasse::methode(Param *p) { P& rp = (*p); }?
Ciao
-
P rp = (*p);
//rp -> Objekt auf das der Zeiger zeigt
P *r = &rp;
//r neuer zeiger auf das objekt
aber glaub
P &rp= .. geht nich
weis aber nich genau
-
BorisDieKlinge schrieb:
aber glaub
P &rp= .. geht nich
Natürlich geht das. Da man allerdings den Pointer dereferenziert muss man zuvor sicherstellen, dass dieser auch auf ein gültiges Objekt verweist.
-
@Boris:
P rp = (*p);Erzeugt eine Kopie des Objekts auf das p zeigt.
Der Rest:
P& rp = (*p);geht tatsächlich. Dann ich rp eine Referenz auf das Objekt, auf das p zeigt. Aber Obacht: Das ist der klassische Fall um eine ungültige Referenz zu erzeugen, z.B. wenn p NULL ist oder ins Nirvana zeigt.
EDIT: (s.a. HumeSikkins) die Dereferenzierung ist schon undefiniert, dürfte aber bei den meisten Compilern funktionieren, bis man rp selbst benutzt...
-
Hallo nochmals,
nun muss ich nach langer Zeit nochmal ein bisschen wiederkauen (bin immer noch blutiger Anfänger).
Da ja nun Referenzen zumGlück doch keine komplette Objektkopien sind, habe ich mal eine Frage zum Umgang mit denselben:
Ich habe bei meinem Projekt mehrere Klassen (z.T. komplett statisch), die auf Anforderung Objekte erzeugen und diese auch intern in STL-Containern verwalten, da sie auch verschiedene Zugriffs- bzw. Suchmöglichkeiten auf die erzeugten Objekte anbieten.
Nun hab ich das so implementiert, dass die Methoden, welche die Objekte erzeugen, die Objekte mit new anlegen und den Zeiger in den jew. STL-Containern speichern und auch zurückgeben.
In den Destruktoren der Klassen, welche die Objekte erzeugen werden dann die STL-Container abgelaufen, die darin liegenden Zeiger mit einem delete bedacht und die Container geleert.
Meine Fragen dazu sind nun aber:
1. Was passiert in den statischen Klassen, die ja auch Objekte erzeugen und in statischen STL-Membervariablen ablegen? Wann werden hier die Objekte gelöscht (bzw. deren Zeiger mit delete bedacht)? Beim Beenden des Programmes?
2. Ist es sinnvoller den Objekterzeugungsmethoden als Rückgabewert eine Referenz (wenn möglich konstant) zu geben statt eines Zeigers auf das neu erzeugte Objekt? (Bei einem Zeiger kann ja jeder delete darauf aufrufen!)
Vielen Dank schon einmal
Ciao