bigpoint Geschrieben 6. Februar 2003 Geschrieben 6. Februar 2003 Hallo, man kann eine Funktion so schreiben CString xyz(CString str) { return str; } [/PHP] oder so [PHP]void xyz(CString &str) { } in beiden Fehlen kriege ich str zurück, was ist besser bzw. was benutz man wann ?? Zitieren
SgtBadAzz Geschrieben 6. Februar 2003 Geschrieben 6. Februar 2003 Originally posted by 007ski Hallo, man kann eine Funktion so schreiben CString xyz(CString str) { return str; } [/PHP] oder so [PHP]void xyz(CString &str) { } in beiden Fehlen kriege ich str zurück, was ist besser bzw. was benutz man wann ?? Ich wuerde generell die erste Variante bevorzugen, da dadurch die Kopplung reduziert wird, beim zweiten Fall veraendere ich was im Aufrufer irgendwo definiert wurde und das kann doch dann zu boesen Nebenwirkungen fuehren wenn man sich dessen nicht (mehr) bewusst ist. Wobei ich glaube, dass str nach dem Verlassen von xyz nicht mehr gueltig ist da es ein formaler Parameter ist und dann nach der Call-Stack-Bereininung nicht mehr gueltig ist, das str ja ein "formaler Parameter" ist. Ich wuerde einen Zeiger auf CString zurueckgeben und das Objekt in xyz mittels new auf dem Heap anlegen. Frank Zitieren
bigpoint Geschrieben 6. Februar 2003 Autor Geschrieben 6. Februar 2003 Originally posted by SgtBadAzz Ich wuerde generell die erste Variante bevorzugen, da dadurch die Kopplung reduziert wird was meinst Du unter Kopplung Originally posted by SgtBadAzz beim zweiten Fall veraendere ich was im Aufrufer irgendwo definiert wurde und das kann doch dann zu boesen Nebenwirkungen fuehren wenn man sich dessen nicht (mehr) bewusst ist. ich dachte ich gebe nur die Adresse verende aber nichts Originally posted by SgtBadAzz Ich wuerde einen Zeiger auf CString zurueckgeben und das Objekt in xyz mittels new auf dem Heap anlegen. Frank kannst Du ein Beispielcode schreiben Zitieren
Klotzkopp Geschrieben 6. Februar 2003 Geschrieben 6. Februar 2003 Originally posted by SgtBadAzz Wobei ich glaube, dass str nach dem Verlassen von xyz nicht mehr gueltig ist da es ein formaler Parameter ist und dann nach der Call-Stack-Bereininung nicht mehr gueltig ist, das str ja ein "formaler Parameter" ist.Das ist kein Problem, da vor dem Verlassen der Funktion eine Kopie des Rückgabewertes auf dem Stack angelegt wird. Nur das Zurückgeben von Adressen oder Referenzen lokaler Variablen ist ein Fehler. Zitieren
SgtBadAzz Geschrieben 6. Februar 2003 Geschrieben 6. Februar 2003 Originally posted by 007ski was meinst Du unter Kopplung ich dachte ich gebe nur die Adresse verende aber nichts kannst Du ein Beispielcode schreiben Na ja , wenn ich was per Referenz uebergebe habe ich die Moeglichkeit darin was zu aendern und die Aenderung bleibt bestehen auch wenn die Funktion verlassen wird, d.h. ich kopple das stark aneinander. Man uebergibt ja meistens eine Referenz wenn man was veraendern will. void xyz(CString &str) { str.add("noch mehr Text"); // zum Beispiel } Dann wird str im Aufrufer dadurch veraendert, das finde ich nicht so schoen, vor allem weil der Aufrufer eventuell nicht weiss das du das machst, man muss das dann sehr genau dokumentieren und es kann unter umstaenden zu ein paar nasty bugs fuehren. Das mit dem Heap habe ich so gemeint: CString* xyz(CString str) { CString *p_Cstr = new CString("Teil 1 "); p_CStr->add(", Teil 2"); } Zitieren
SgtBadAzz Geschrieben 6. Februar 2003 Geschrieben 6. Februar 2003 Originally posted by 007ski was meinst Du unter Kopplung ich dachte ich gebe nur die Adresse verende aber nichts kannst Du ein Beispielcode schreiben Na ja , wenn ich was per Referenz uebergebe habe ich die Moeglichkeit darin was zu aendern und die Aenderung bleibt bestehen auch wenn die Funktion verlassen wird, d.h. ich kopple das stark aneinander. Man uebergibt ja meistens eine Referenz wenn man was veraendern will. void xyz(CString &str) { str.add("noch mehr Text"); // zum Beispiel } Dann wird str im Aufrufer dadurch veraendert, das finde ich nicht so schoen, vor allem weil der Aufrufer eventuell nicht weiss das du das machst, man muss das dann sehr genau dokumentieren und es kann unter umstaenden zu ein paar nasty bugs fuehren. Das mit dem Heap habe ich so gemeint: CString* xyz(CString str) { CString *p_Cstr = new CString("Teil 1 "); p_CStr->add( str.c_str()); // ich weiss nicht genau wie die methoden aussehen, // aber es geht ja um das Prinzip return p_Cstr; } Das CString Objetc mit Teil 1 usw. ist dann auf dem Heap und nach verlassen der Funktion immer noch gueltig. Frank Zitieren
SgtBadAzz Geschrieben 6. Februar 2003 Geschrieben 6. Februar 2003 Originally posted by Klotzkopp Das ist kein Problem, da vor dem Verlassen der Funktion eine Kopie des Rückgabewertes auf dem Stack angelegt wird. Nur das Zurückgeben von Adressen oder Referenzen lokaler Variablen ist ein Fehler. Ja stimmt, habe mich vertan, er macht ja eine 1 zu 1 Kopie und die wird wie ein normaler Rueckgabeparamter behandelt. Frank Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.