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 ??
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
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
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.
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"); }
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
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
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden