🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Problem bei Verwendung von "const"

#1294
From: Karsten Baensch
Date: Tue, 16 Jan 1996 09:38
69 lines
3514 bytes
sg102ne@e45-hrze.uni-duisburg.de (Nepomuck) writes:


>Bei Verwendung von Klassen mit "const"-Methoden bin ich auf ein Problem
>gestossen, fuer das ich derzeit keine Loesung habe:

>Angenommen, ich habe eine Klasse A definiert, welche einige
>"const"-Methoden zum Abfragen von bestimmten Eigenschaften definiert. 
>Anfaenglich sind mir diese Methoden schnell genug, aber nach einiger
>Zeit stelle ich fest, dass ich aus Effizienzgruenden mehrere
>Repraesentationen der internen Daten meiner Klasse A benoetige, und dass
>meine Klasse A beim Aufruf einer der Abfragefunktionen einen Repraesentations-
>wechsel der Daten vornehmen muss. Weil ich die Abfragefunktionen oft aufrufen
>moechte, moechte ich die neuen Repraesentation der Daten in A speichern.
>Dabei entsteht das Problem, dass die urspruenglichen "const"-Methoden
>ploetzlich nicht mehr "const" sein koennen, obwohl sich an ihrer
>Funktionalitaet eigentlich nichts aendert.

>Beispiel:

>Eine Klasse "complex" fuer komplexe Zahlen speichert zunaechst nur
>Real- und Imaginaerteil der Zahlen. Abgefragt werden sollen aber auch Polar-
>koordinaten (z.B. mittels zweier Methoden complex::Winkel() und
>complex::Betrag()). Normalerweise koennten diese Funktionen als "const"
>deklariert werden, aber ich moechte erreichen, dass die zeitaufwendige
>Umrechnung in Winkel und Betrag nur beim ersten Aufruf der zugehoerigen
>Funktionen geschieht. Das Problem dabei ist, dass die Funktionen jetzt nicht
>mehr als "const" deklariert werden koennen. Ich moechte allerdings auch
>nicht grundsaetzlich zu jeder komplexen Zahl Winkel und Betrag von
>vornherein schon im Konstruktor-Aufruf berechnen, weil es Programmteile geben
>kann, die die Funktionen "Winkel()" und "Betrag()" gar nicht aufrufen.

>Gibt es eine Moeglichkeit, dafuer zu sorgen, dass Winkel() und Betrag()
>trotzdem als "const" deklariert werden?  Ansonsten entsteht naemlich das
>Problem, dass in saemtlichen Klassen, die ein Objekt der Klasse
>"complex" als Member-Variable beinhalten und "Winkel()" oder "Betrag()"
>aufrufen, die aufrufenden Methoden ebenfalls nicht mehr als "const"
>deklariert werden koennen. 

>Vielen Dank fuer jede Hilfe,

>- Michael -
>sg102ne@e45-hrze.uni-dortmund.de

Kenne das Problem:
Einfach in den const-Methoden vom this-Zeiger das const 'wegcasten', dann mit
dem Resultat auf die Klassenelemente zugreifen. Beispiel:

double complex::Betrag() const
{
// 'this' ist hier vom Typ 'const complex *', also:
  ((complex *)this)->abs = hypot(real, imag);

// noch Winkel berechnen und evtl. Flag 'Betrag-Winkel vorhanden' setzen

  return abs;
}

Manche Compiler (z.B. Borland) stellen dafuer sogar eingebaute Operatoren
zur Verfuegung, Beispiel Borland: 'const_cast'.

Gruss,
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: <4dfsv7$m36@pyrrhus-f.hrz.tu-chemnitz.de>
Path: arc1-ca.pugleaf.net!news.tu-chemnitz.de!news
References: <4davqq$4ni@h20-hrze.uni-duisburg.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: Problem bei Verwendung von "const"
Date: 16 Jan 96 09:38:12 GMT
Organization: University of Technology Chemnitz, FRG
Message-ID: <4dfsv7$m36@pyrrhus-f.hrz.tu-chemnitz.de>
References: <4davqq$4ni@h20-hrze.uni-duisburg.de>
NNTP-Posting-Host: shark.hrz.tu-chemnitz.de