funktionsaufruf soll zeiger nicht kopieren...
-
hallo,
ich habe eine klasse geschrieben ueber die ich mittels zeiger auf die einzelnen instanzen zugreife. nun moechte ich einer funktion einen _lokalen_ zeiger uebergeben, der durch die funktion wo anders(auf ein anderes objekt) hin zeigen soll.
das problem ist, das beim aufruf der funktion der zeiger kopiert wird und am ende sich der zeiger doch nicht aendert. als rueckgabewert kann ich ihn nicht uebergeben, da der schon fuer was anderes benutzt wird. so habe ich mir gedacht den zeiger als referenz zu uebergeben, damit er nicht kopiert wird. doch dass will mein compiler nicht schlucken ... oder mit anderer syntax haengt sich mein programm dann auf.
bsp:
main(){
telefonat * akt = ...; // telefonat ist meine klasse
funktion(akt);
//akt zeigt trotzdem noch auf das gleiche element
}void funktion(telefonat* & akt){
//do something
}was kann ich da tun? ist das prinzipiell nicht moeglich?
gabriel
-
kannste mit zeiger auf zeiger machen
main() { telefonat *akt = ...; // telefonat ist meine klasse funktion(&akt); } void funktion (telefonat **akt) { // do something delete *akt; *akt = new telefonat(); }
-
Geht auch mit Referenz auf Zeiger, nennt sich aber &* statt *&. Fand ich auch unintuitiv, aber naja. Also:
void funktion(telefonat &*akt){ //do something }
-
Quatsch, Zeiger werden doch bei Funktionsaufrufen nicht kopiert. Einfach normal übergeben und fertig!
-
@0xdeadbeef
Bist du dir da sicher? Ich kenn das eher mit *&. Das funktioniert bei meinen Compilern auch so (MinGW, BCB).@Was!?!?!?!?
Lies dir bitte noch mal das Tutorial deiner Wahl durch. Natürlich werden Zeiger kopiert.
-
Was!?!?!?!? schrieb:
Quatsch, Zeiger werden doch bei Funktionsaufrufen nicht kopiert. Einfach normal übergeben und fertig!
Versuch folgenden Code, und du wirst sehen, dass er kopiert wird! Aber ist ja auch völlig klar.
#include <iostream> void foo(int *p) { p=NULL; } int main() { int *p = new int(5); foo(p); std::cout << p; return 0; }
-
Und die richtige variante funktioniert mit
foo(int *&p)
wobei das nach meiner meinung viel unintuitiver ist!
-
danke fuer die schnellen antworten. mein compiler g++-3.4 kompilert beide varianten, die telefonat *&akt variante und auch die zeiger auf zeiger methode. theoretisch erscheint mir das auch logisch, aber...
beim zugriff in der funktion, auf eine elementfunktion zb.:
void(telefonat *&akt){
cout << "\nspringe zum vorigen element der liste\n";
if (akt->gpre() != NULL) akt = akt->gpre();
else cout << "\ndas ist das erste Element.\n";
}haengt sich mein programm auf, d.h. der prozessor arbeitet 100% und nix tut sich.
gabriel
-
Ist akt ein gültiger Pointer (würde ich vorher lieber testen).
Was macht gpre()?
Bist du mal mit dem Debugger durchgegangen?
An der Funktionsdeklaration liegt es jedenfalls nicht.
-
ok, ok, ok vielen vielen dank.
das problem jetzt liegt an meinem code und einer nicht ueberpruften iterationsbedingung...gabriel
-
Slin schrieb:
Und die richtige variante funktioniert mit
foo(int *&p)
wobei das nach meiner meinung viel unintuitiver ist!
Du wirst deine Meinung ändern oder zumindest relativieren, wenn du die Deklarationssyntax von C++ verstanden hast.
-
@Slin: Wenn du schon mal was von Speicherlöchen gehört hättest würdest du verstehen, warum ich diesen Code nicht testen werde.
-
Bitte nicht füttern.
-
Was!?!?!?!? schrieb:
@Slin: Wenn du schon mal was von Speicherlöchen gehört hättest würdest du verstehen, warum ich diesen Code nicht testen werde.
Speicher, welcher von einem Programm reserviert wird, wird freigegeben, sobald das Programm beendet wird.
Wäre dies nicht so, müßte man ja jedesmal den Rechner neustarten, um den nicht-freigegebenen Speicher wieder nutzen zu können.
-
Was!?!?!?!? schrieb:
@Slin: Wenn du schon mal was von Speicherlöchen gehört hättest würdest du verstehen, warum ich diesen Code nicht testen werde.
dann musste den computer tauschen. das ist wie bei von motten zerfressenen klamotten. wenn die bits alle in ein bodenloses loch fallen ist er ein fall für den sperrmüll :p
-
Bashar schrieb:
Slin schrieb:
Und die richtige variante funktioniert mit
foo(int *&p)
wobei das nach meiner meinung viel unintuitiver ist!
Du wirst deine Meinung ändern oder zumindest relativieren, wenn du die Deklarationssyntax von C++ verstanden hast.
Ja okay, da fehlt ein delete am ende, wirste wohl aber noch selber eintragen können. Habs halt eifnach vergessen... wollte aber nicht den Speicherplatz deines Rechners für immer wegschmeißen.