Article View: de.comp.lang.c++
Article #1660Re: Q: operatoren ueberladen -> wer loescht evtl. neue Instanzen????
From: Karsten Baensch
Date: Thu, 15 Feb 1996 13:27
Date: Thu, 15 Feb 1996 13:27
57 lines
3560 bytes
3560 bytes
brenck@iib.bauwesen.th-darmstadt.de (Dirk Brenckmann) writes: >Hallo, ich bin 25 und habe ein Problem... *grins* Warte erstmal ab, bis Du 30 bist...;-) >Im Ernst. Speziell beim Ueberladen von + und - operatoren in Klassen >ergibt sich das Problem, dass ich innerhalb der Methoden neue Instanzen >schaffen muss, um die per return wieder zuruck zu geben. >Erzeuge ich solche Instanzen mit "new" stellt sich die Frage, von wem >und wann sie vernichtet werden. (Meistens gar nicht mehr. Das wird bei >megalangen Listen ganz schnell zum Speicherproblem) . Also mit 'new' zu erzeugen ist keine gute Idee, denn die Zuweisung an das Ergebnisobjekt erfolgt per Value oder per Reference und ist darueberhinaus nicht Pflicht, sodass Du im unguenstigsten Falle bei der spaeteren Verwendung keinen Zeiger auf das dynamisch angelegte Objekt mehr hast oder (im guenstigsten Fall) erst die Adresse ermitteln musst. >Instanziere ich ohne "new" laueft der Gueltigkeitsbereich der Variable >von der Instanzierung, bis zum "return", indem der Destruktor der >Klasse aufgerufen wird. -> D.H. ich "returne" einen wieder freigegebenen >Speicherplatz :((( Bei kleinen Klassen funktioniert das. Listen jedoch >gehen zumeist verloren. >Da das meiner Einschaetzung nach ein elementares Problem der objektorien- >tierten Programmierung ist, sollte es da auch eine saubere Loesung geben. >Nur - wer kennt sie??? Bitte Mailen, da dringend ... danke. Nanana. Da schaue Dir doch nochmal an, wie ein return funktioniert. Der Wert des return-Ausdruckes wird in den aufrufenden Kontext der Funktion zurueckgeliefert. Und zwar mittels Kopie! Damit wird auch klar, warum das bei Deinen Listen nicht funktioniert. Du brauchst einen Copy-Konstruktor, der Dir sauber ein temporaeres Objekt aus Deinem Return-Wert erzeugen kann. Dann brauchst Du auch noch einen Zuweisungsoperator, um die Elemente des temporaeren Objektes in die Deiner Ergebnisvariable zu kopieren. Alles in allem eine fuer die Laufzeit zu aufwendige Loesung. Zuerst Erzeugung des automatischen Objektes im Kontext der Operator-Funktion, dann Berechnung der Operation, dann Erzeugung des temporaeren Objektes mittels Kopie, dann Zuweisung des letztgenannten an das Ergebnis-Objekt mittels Zuweisungsoperator. Intelligente Compiler sparen bei einem Statement wie ListenTyp ErgListe = Liste1 + Liste2; das temporaere Objekt ein; das wird dann gleich in der Ergebnisvariable initialisiert. Aber fuer die Verwendung bei z.B. Listen trotzdem zu aufwendig. Bei Listen werden deshalb eigentlich keine solcher + - Operatoren geschrieben. Das Anhaengen etc. wird bei Listen und anderen Containern deshalb ueber Memberfunktionen gemacht, wie z.B. void <T>DLList::join(<T>DLList& b) (Quelle: GNU C++ Gen-Lib) Viel Spass noch, Karsten -- ( Email: Karsten.Baensch@hrz.tu-chemnitz.de ( ) WWW: http://www.tu-chemnitz.de/~kba/baensch.html ) ( Phone: (+49-) 0371/531-1252 ( ) Mail: Technical University, Computing Services, 09107 Chemnitz, Germany )
Technical Details
Message-ID:
<4fvcmp$f71@pyrrhus-f.hrz.tu-chemnitz.de>Path:
arc1-ca.pugleaf.net!news.tu-chemnitz.de!newsReferences:
<4fspll$j05@rs18.hrz.th-darmstadt.de>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.tu-chemnitz.de!news From: kba@hrz.tu-chemnitz.de (Karsten Baensch) Newsgroups: de.comp.lang.c++ Subject: Re: Q: operatoren ueberladen -> wer loescht evtl. neue Instanzen???? Date: 15 Feb 96 13:27:40 GMT Organization: University of Technology Chemnitz, FRG Message-ID: <4fvcmp$f71@pyrrhus-f.hrz.tu-chemnitz.de> References: <4fspll$j05@rs18.hrz.th-darmstadt.de> NNTP-Posting-Host: shark.hrz.tu-chemnitz.de