🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #1660

Re: Q: operatoren ueberladen -> wer loescht evtl. neue Instanzen????

#1660
From: Karsten Baensch
Date: Thu, 15 Feb 1996 13:27
57 lines
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!news
References: <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