🚀 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 Christoph Liebig Tue, 22 Aug 1995 11:12
Typ Konversion
#290
Author: Christoph Liebig
Date: Tue, 22 Aug 1995 11:12
16 lines
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
#291
Author: Enno Sandner
Date: Tue, 22 Aug 1995 12:31
36 lines
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
#296
Author: Bernd Eggink
Date: Wed, 23 Aug 1995 08:39
48 lines
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
#297
Author: Harald Fuchs
Date: Wed, 23 Aug 1995 12:47
11 lines
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
#298
Author: Bernd Eggink
Date: Wed, 23 Aug 1995 15:23
38 lines
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
#312
Author: Bernd Braun
Date: Thu, 24 Aug 1995 11:30
38 lines
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
#314
Author: Bernd Eggink
Date: Fri, 25 Aug 1995 14:46
40 lines
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