🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Problem bei Verwendung von "const"

#1271
From: Enno Sandner
Date: Sun, 14 Jan 1996 16:33
89 lines
3946 bytes
In article <4davqq$4ni@h20-hrze.uni-duisburg.de> 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. 

Ja, Du kannst die entsprechende Member-Variable als 'mutable' deklarieren

---
#include <iostream.h>
#include <math.h>

#define MUTABLE 1

class Complex {
 public:
  Complex(double r,double i) : real_(r), imag_(i), valid_(false) {}

  double Betrag() const {
    if (!valid_) {
#ifdef MUTABLE
      betrag_=sqrt(real_*real_+imag_*imag_);
      valid_=true;
#else
      Complex* nc_this=(Complex*)this;
      nc_this->betrag_=sqrt(real_*real_+imag_*imag_);
      nc_this->valid_=true;
#endif
    }
    return betrag_;
  }

 private:
  double real_,imag_;
#ifdef MUTABLE
  mutable bool valid_;
  mutable double betrag_;
#else
  bool valid_;
  double betrag_;
#endif
};

int main()
{
  Complex c(1.1,2.3);
  double w=c.Betrag();
  w=c.Betrag();
}
---
Falls der Compiler dieses Feature noch nicht unterstuetzt, hilft nur (*)
die Holzhammermethode, d.h. den 'this' Pointer entsprechend zu casten.

        Enno

(*) Ich nehme dabei stillschweigend an, dass ein Compiler der 'mutable'
    nicht unterstuetzt auch keinen 'const_cast' Support hat.
Technical Details
Message-ID: <ENNO.96Jan14173326@kitz.inferenzsysteme.informatik.th-darmstadt.de>
Path: arc1-ca.pugleaf.net!news.th-darmstadt.de!news!enno
References: <4davqq$4ni@h20-hrze.uni-duisburg.de>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.th-darmstadt.de!news!enno
From: enno@inferenzsysteme.informatik.th-darmstadt.de (Enno Sandner)
Newsgroups: de.comp.lang.c++
Subject: Re: Problem bei Verwendung von "const"
Date: 14 Jan 1996 16:33:26 GMT
Organization: Fachbereich Informatik, TH Darmstadt
Distribution: world
Message-ID: <ENNO.96Jan14173326@kitz.inferenzsysteme.informatik.th-darmstadt.de>
References: <4davqq$4ni@h20-hrze.uni-duisburg.de>
NNTP-Posting-Host: kitz.intellektik.informatik.th-darmstadt.de
In-reply-to: sg102ne@e45-hrze.uni-duisburg.de's message of 14 Jan 1996 13:18:18 GMT