🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.lang.c++
7 messages
7 total messages Started by Dirk Brenckmann Wed, 14 Feb 1996 13:55
Q: operatoren ueberladen -> wer loescht evtl. neue Instanzen????
#1655
Author: Dirk Brenckmann
Date: Wed, 14 Feb 1996 13:55
22 lines
1701 bytes
Hallo, ich bin 25 und habe ein Problem... *grins*

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) .
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.

MfG, db
--
brenck@iib.bauwesen.th-darmstadt.de (Dirk Brenckmann)
Bessunger Str.194, 64295 Darmstadt, Tel.: 06151 312641 Q  Fax auf Anfrage.
cand.-Ing. Bauing.wesen, Inst.f.Num.Method.i.Bauwesen, 06151 166679 (CAD-Labor) 
Re: Q: operatoren ueberladen -> wer loescht evtl. neue Instanzen????
#1639
Author: Enno Sandner
Date: Wed, 14 Feb 1996 16:31
24 lines
1819 bytes
Dirk Brenckmann wrote:
> 
> Hallo, ich bin 25 und habe ein Problem... *grins*
> 
> 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) .
> 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.
> 

Ich sehe keinen Grund keine Instanz zurueckzugeben, solange sich 
Objekte Deiner Klasse beim Kopieren bzw. Zuweisen korrekt verhalten.

	Enno
Re: Q: operatoren ueberladen -> wer loescht evtl. neue Instanzen????
#1658
Author: Andreas Zierdt
Date: Wed, 14 Feb 1996 17:06
47 lines
1972 bytes
Dirk Brenckmann (brenck@iib.bauwesen.th-darmstadt.de) wrote:

: 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.

Das folgende Beispiel sollte zeigen, wie es geht:

/* Der Operator = ermöglicht Zuweisungen von Vektoren.*/

template<class T> Vector<T>& Vector<T>::operator=(const Vector& v)
{
        unsigned int    i;
        
        if (this == &v)
           return( *this);        

        for (i=0; i<dim; i++)
           data[i] = v.data[i];

          return (*this);
}

/* Die Operatoren + und - erlauben Vektoraddition und -subtraktion. */          

template<class T> Vector<T> Vector<T>::operator+(const Vector& v) const
{
         unsigned int    i;
         Vector result(dim);
          
          for (i=0; i<dim; i++)
                  result.data[i] = data[i] + v.data[i];
                  
          return(result);
}          

Berechnet man jetzt a = b + c, so umfaßt die Lebensdauer des neuen, von
+() erzeugten Objekts, die Zeit, während der der operator=() aktiv ist.

Andreas

--
Andreas Zierdt,    Institut fuer Phonetik und sprachliche Kommunikation
                   Universitaet Muenchen, Schellingstr. 3
                   80799 Muenchen, Germany

E-mail: andi@sun1.phonetik.uni-muenchen.de                   
Re: Q: operatoren ueberladen -> wer loescht evtl. neue Instanzen????
#1659
Author: Benjamin Baermann
Date: Thu, 15 Feb 1996 12:34
11 lines
927 bytes
In <4fspll$j05@rs18.hrz.th-darmstadt.de> brenck@iib.bauwesen.th-darmstadt.de (Dirk Brenckmann) writes:
>Nur - wer kennt sie??? Bitte Mailen, da dringend ... danke.

Nicht mailen sondern posten bitte! Es interessiert auch andere.

Gruesse, Benni
-- 
http://www.uni-frankfurt.de/~benni/hello.html
"1024 Byte bilden ein Megabyte"
	aus einer Schrift des Bundesministerums fuer Wirtschaft zur
	"Informationsgesellschaft" 
Re: Q: operatoren ueberladen -> wer loescht evtl. neue Instanzen????
#1660
Author: 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  )
Re: Q: operatoren ueberladen -> wer loescht evtl. neue Instanzen????
#1661
Author: Karsten Baensch
Date: Thu, 15 Feb 1996 13:42
63 lines
2938 bytes
andi@linux8.phonetik.uni-muenchen.de (Andreas Zierdt) writes:

>Dirk Brenckmann (brenck@iib.bauwesen.th-darmstadt.de) wrote:

>: 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.

>Das folgende Beispiel sollte zeigen, wie es geht:

>/* Der Operator = ermöglicht Zuweisungen von Vektoren.*/

>template<class T> Vector<T>& Vector<T>::operator=(const Vector& v)
>{
>        unsigned int    i;
>        
>        if (this == &v)
>           return( *this);        

>        for (i=0; i<dim; i++)
>           data[i] = v.data[i];

>          return (*this);
>}

>/* Die Operatoren + und - erlauben Vektoraddition und -subtraktion. */          

>template<class T> Vector<T> Vector<T>::operator+(const Vector& v) const
>{
>         unsigned int    i;
>         Vector result(dim);
>          
>          for (i=0; i<dim; i++)
>                  result.data[i] = data[i] + v.data[i];
>                  
>          return(result);
>}          

>Berechnet man jetzt a = b + c, so umfaßt die Lebensdauer des neuen, von
>+() erzeugten Objekts, die Zeit, während der der operator=() aktiv ist.

Wenn er zusaetzlich noch einen korrekten Copykonstruktor fuer Vector<T> 
definiert, dann funktionierts. Denn das innerhalb von 
'template<class T> Vector<T> Vector<T>::operator+(const Vector& v) const'
mit Vector 'result(dim);' erzeugte automatische Objekt ist zur Zeit der
Ausfuehrung von 'operator=()' nicht mehr am Leben! Wenn obige Aussage so
gemeint war, dann ist sie meiner Meinung nach falsch. Korrigiert mich,
wenn ich mich irre.
Wenn es so waere, dann koennte 'operator+' auch eine Referenz auf 'result'
zurueckliefern, um diese dann an 'operator=(const Vector& v)' zu
uebergeben. Das wuerde vieles einfacher machen. Geht aber nicht.

Erst durch 'return(result);' wird im Kontext der
aufrufenden Funktion ein temoraeres Objekt erzeugt und mit 'result'
initialisiert. Fuer eben diese Initialisierung braucht man den
Copykonstruktor.

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  )
Re: Q: operatoren ueberladen -> wer loescht evtl. neue Instanzen????
#1663
Author: Andreas Zierdt
Date: Fri, 16 Feb 1996 14:58
39 lines
2183 bytes
Karsten Baensch (kba@hrz.tu-chemnitz.de) wrote:

: Wenn er zusaetzlich noch einen korrekten Copykonstruktor fuer Vector<T> 
: definiert, dann funktionierts. Denn das innerhalb von 
: 'template<class T> Vector<T> Vector<T>::operator+(const Vector& v) const'
: mit Vector 'result(dim);' erzeugte automatische Objekt ist zur Zeit der
: Ausfuehrung von 'operator=()' nicht mehr am Leben! Wenn obige Aussage so
: gemeint war, dann ist sie meiner Meinung nach falsch. Korrigiert mich,
: wenn ich mich irre.
: Wenn es so waere, dann koennte 'operator+' auch eine Referenz auf 'result'
: zurueckliefern, um diese dann an 'operator=(const Vector& v)' zu
: uebergeben. Das wuerde vieles einfacher machen. Geht aber nicht.

: Erst durch 'return(result);' wird im Kontext der
: aufrufenden Funktion ein temoraeres Objekt erzeugt und mit 'result'
: initialisiert. Fuer eben diese Initialisierung braucht man den
: Copykonstruktor.

Stimmt natürlich, den Copykonstruktor habe ich unterschlagen. Das wäre
dann also noch:

template<class T> Vector<T>::Vector(const Vector& v)
{
        unsigned int    i;
        dim = v.dim;
        
        for (i=0; i<dim; i++)
            data[i] = v.data[i];
}                                             

Hielt ich für offensichtlich, war es aber nicht.  :-)

Andreas
--
Andreas Zierdt,    Institut fuer Phonetik und sprachliche Kommunikation
                   Universitaet Muenchen, Schellingstr. 3
                   80799 Muenchen, Germany

E-mail: andi@sun1.phonetik.uni-muenchen.de                   
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads