Thread View: de.comp.lang.c++
7 messages
7 total messages
Started by Christoph Liebig
Tue, 22 Aug 1995 11:12
Typ Konversion
Author: Christoph Liebig
Date: Tue, 22 Aug 1995 11:12
Date: Tue, 22 Aug 1995 11:12
16 lines
1254 bytes
1254 bytes
Hallo ! Bekanntlich kann man in C++ eigene Typkonversionsoperatoren definieren. Beispielsweise um ein Objekt der Klasse A nach B zu casten, koennte in A der operator B()' definiert werden, der ein B-Objekt zurueckliefern muss. Was bedeutet das fuer das target-Objekt der Klasse A, wenn es nach B gecastet wird ? Wird das Objekt A zerstoert -- ich denke nein, und nehme an, dass bei casts sogenannte temporary objects erzeugt werden. Wenn dem so ist, muesste in operator B() eine neues B Objekt konstruiert werden und ueberdies koennte der operator B() gegebenenfalls als const deklariert werden. Gibt es dazu naehere Vorschriften oder Konventionen (beispieslweise koennten cast operatoren guenstigerweise nur eine Referenz zurueckliefern) ? Chris
Re: Typ Konversion
Author: Enno Sandner
Date: Tue, 22 Aug 1995 12:31
Date: Tue, 22 Aug 1995 12:31
36 lines
2376 bytes
2376 bytes
Christoph Liebig <chris>: >Bekanntlich kann man in C++ eigene Typkonversionsoperatoren definieren. >Beispielsweise um ein Objekt der Klasse A nach B zu casten, koennte in A der >operator B()' definiert werden, der ein B-Objekt zurueckliefern muss. >Was bedeutet das fuer das target-Objekt der Klasse A, wenn es nach B gecastet >wird ? Wird das Objekt A zerstoert -- ich denke nein, und nehme an, dass bei >casts sogenannte temporary objects erzeugt werden. Was die Lebensdauer der A- und der zurueckgelieferten B-Instanz betrifft, verhaelt es sich genauso wie bei Memberfunctions. Wird eine Instanz der Klasse B zurueckgeliefert, wird der B-Copy-Constructor aufgerufen, ein temporaeres Objekt erzeugt und an geeigneter Stelle wieder zerstoert. Bei einer Initialisierung der Form 'B b=(B)a;' bleibt das temp. Objekt z.B. solange bestehen, bis die Initialisierung von 'b' abgeschlossen ist. Einen Einfluss auf die Lebensdauer der A-Instanz hat dies (i.allg.) nicht. >Wenn dem so ist, muesste in operator B() eine neues B Objekt konstruiert >werden und ueberdies koennte der operator B() gegebenenfalls als const >deklariert werden. Ja >Gibt es dazu naehere Vorschriften oder Konventionen (beispieslweise koennten >cast operatoren guenstigerweise nur eine Referenz zurueckliefern) ? Das haengt stark von der Art der Typumwandlung ab. Falls die B Instanz z.B. als Member-Variable in der Klasse A enthalten ist, bietet es sich sicherlich an eine *konstante* Referenz darauf zurueckzuliefern. Der Nachteil von Konversionsoperatoren ist, dass man ein Stueck 'Kontrolle' ueber sein Programm verliert, was zu wirklich ueblen (=schwer auffindbaren) Fehlern fuehren kann. Haeufig ist deshalb eine normale Memberfunction vorzuziehen, auch wenn auf den ersten Blick der Konversionsoperator schicker aussieht. Gruss Enno
Re: Typ Konversion
Author: Bernd Eggink
Date: Wed, 23 Aug 1995 08:39
Date: Wed, 23 Aug 1995 08:39
48 lines
2278 bytes
2278 bytes
Christoph Liebig (chris) wrote: > Hallo ! > Bekanntlich kann man in C++ eigene Typkonversionsoperatoren definieren. > Beispielsweise um ein Objekt der Klasse A nach B zu casten, koennte in A der > operator B()' definiert werden, der ein B-Objekt zurueckliefern muss. > Was bedeutet das fuer das target-Objekt der Klasse A, wenn es nach B gecastet > wird ? Wird das Objekt A zerstoert Nur wenn Du darauf bestehst. Natuerlich kann die Funktion A::operator B() eigene Member veraendern oder gar "delete this" aufrufen - sinnvoll ist das meist nicht. Vorsichtshalber sollte man sie gleich als const deklarieren. > -- ich denke nein, und nehme an, dass bei > casts sogenannte temporary objects erzeugt werden. > Wenn dem so ist, muesste in operator B() eine neues B Objekt konstruiert > werden und ueberdies koennte der operator B() gegebenenfalls als const > deklariert werden. Ob temporaere Objekte erzeugt werden, haengt vom Compiler ab. Es steht ihm frei, sie in geeigneten Situationen wegzuoptimieren. Beispiel: A a(4711); B b(a); Ein schlauer Compiler kann direkt das Objekt b initialisieren, ohne Umweg ueber eine temporaere Variable. > Gibt es dazu naehere Vorschriften oder Konventionen (beispieslweise koennten > cast operatoren guenstigerweise nur eine Referenz zurueckliefern) ? Das mit der Referenz ist sinnvoll, wenn es sich um eine auf das A-Objekt selber (bzw. einen Basisteil davon) handelt. Allerdings ist das dann ein anderer Cast, naemlich operator B&(). Beim Cast Referenzen auf _Member_ zurueckgegeben, ist dagegen natuerlich ueberhaupt nicht zu empfehlen. Gruss Bernd -- +----------------------------------+ | Bernd Eggink | | Rechenzentrum Uni Hamburg | | admin@rzaix13.rrz.uni-hamburg.de | +----------------------------------+
Re: Typ Konversion
Author: Harald Fuchs
Date: Wed, 23 Aug 1995 12:47
Date: Wed, 23 Aug 1995 12:47
11 lines
1241 bytes
1241 bytes
admin@rzaix13.uni-hamburg.de (Bernd Eggink) writes: > Beim Cast Referenzen auf _Member_ zurueckgegeben, ist dagegen natuerlich > ueberhaupt nicht zu empfehlen. Wieso? Wenn nach dem Konversionsoperator der Copy-Konstruktor drankommt, wird der Kram i.a. doch sowieso kopiert, und dann kann das Originalobjekt ohne weiteres gelöscht werden. Wenn der Copy-Konstruktor tatsächlich Referenzen speichert, so ist das sein Problem, nicht das des Konversionsoperators.
Re: Typ Konversion
Author: Bernd Eggink
Date: Wed, 23 Aug 1995 15:23
Date: Wed, 23 Aug 1995 15:23
38 lines
1402 bytes
1402 bytes
Harald Fuchs (hf@colibri.de) wrote:
> admin@rzaix13.uni-hamburg.de (Bernd Eggink) writes:
> > Beim Cast Referenzen auf _Member_ zurueckgegeben, ist dagegen natuerlich
> > ueberhaupt nicht zu empfehlen.
> Wieso? Wenn nach dem Konversionsoperator der Copy-Konstruktor
> drankommt, wird der Kram i.a. doch sowieso kopiert, und dann kann das
> Originalobjekt ohne weiteres gelöscht werden.
Kommt er aber nicht immer:
class A
{
public:
// ...
A(int p): x(p) { }
operator int &() { return x; }
private:
int x;
};
A *pa = new A(4711);
int &r = *pa; // Aufruf pa->operator int &()
delete pa;
r = 0; // oops - r zeigt auf geloeschtes Objekt
Gruss
Bernd
--
+----------------------------------+
| Bernd Eggink |
| Rechenzentrum Uni Hamburg |
| admin@rzaix13.rrz.uni-hamburg.de |
+----------------------------------+
Re: Typ Konversion
Author: Bernd Braun
Date: Thu, 24 Aug 1995 11:30
Date: Thu, 24 Aug 1995 11:30
38 lines
1575 bytes
1575 bytes
Hallo,
Ich bin mir nicht sicher, ob Typ-Casting mit eigenen Klassen geht.
In einer Matrix-Klasse benutze ich den Copy-Constructor, um aus einem
Vektor eine Matrix zu erzeugen. Das ist eine echte Umwandlung und nicht
nur eine andere Interpretation.
Bsp:
template <class T> class Matrix
{
..
Matrix ( const Matrix<T>& );
Matrix ( const Vector<T>& );
..
}
template <class T> Matrix<T>::Matrix ( const Vector<T>& a )
{
..
}
In einem Programm koennte man das so anwenden:
Vector<int> V;
Matrix<int> M;
M = M * V;
Aus dem Vektor V wird eine temporaere Matrix erzeugt und diese mit M
multipliziert (mit M.operator*).
M.operator() benutze ich uebrigens zur FORTRAN-Indizierung einer Matrix.
Gruss
Bernd Braun
--
Bernd Braun, mailto:braun@stahlw00.stahl.bau.tu-bs.de
http://stahlw00.stahl.bau.tu-bs.de/people/bbraun.html
Institut fuer Stahlbau, TU Braunschweig
Beethovenstrasse 51, 38106 Braunschweig, Germany
Re: Typ Konversion
Author: Bernd Eggink
Date: Fri, 25 Aug 1995 14:46
Date: Fri, 25 Aug 1995 14:46
40 lines
1498 bytes
1498 bytes
Bernd Braun (braun@stahlw00.stahl.bau.tu-bs.de) wrote:
> Hallo,
> Ich bin mir nicht sicher, ob Typ-Casting mit eigenen Klassen geht.
> In einer Matrix-Klasse benutze ich den Copy-Constructor, um aus einem
> Vektor eine Matrix zu erzeugen. Das ist eine echte Umwandlung und nicht
> nur eine andere Interpretation.
> Bsp:
> template <class T> class Matrix
> {
> ..
> Matrix ( const Matrix<T>& );
> Matrix ( const Vector<T>& );
> ..
> }
> template <class T> Matrix<T>::Matrix ( const Vector<T>& a )
> {
> ..
> }
> In einem Programm koennte man das so anwenden:
> Vector<int> V;
> Matrix<int> M;
> M = M * V;
> Aus dem Vektor V wird eine temporaere Matrix erzeugt und diese mit M
> multipliziert (mit M.operator*).
Prima! Und wo ist das Problem??
Bernd
--
+----------------------------------+
| Bernd Eggink |
| Rechenzentrum Uni Hamburg |
| admin@rzaix13.rrz.uni-hamburg.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