 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Martini Guest
|
Posted: Mon Jun 14, 2004 9:52 pm Post subject: Problem mit const-Deklaration beim Überladen |
|
|
Hallo,
ich habe ein Problem mit einem const-Argument beim Überladen vom
Ausgabeoperator:
ostream& operator<<(ostream& Stream,const MatVec &matvec){
matvec.getirgendwas();
^^^^^^^^^^^^^^^^^^^^^^
...
}
Fehler:
passing `const MatVec' as `this' argument of `int MatVec::getirgendwas()'
discards qualifiers
habe MatVec::getirgendwas auch mal const deklariert, brachte aber keine
Lösung. Compiler: aktueller g++ unter linux.
Ohne const geht alles klar. Wiso 'soll' ich hier überhaupt const anwenden? Nur
um sicherzustellen, das das Objekt nicht modifiziert wird?
Ratschlag?
Gruß
Martin
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Hendrik Belitz Guest
|
Posted: Tue Jun 15, 2004 8:30 am Post subject: Re: Problem mit const-Deklaration beim Überladen |
|
|
Martini wrote:
| Quote: | Hallo,
ich habe ein Problem mit einem const-Argument beim Überladen vom
Ausgabeoperator:
ostream& operator<<(ostream& Stream,const MatVec &matvec){
matvec.getirgendwas();
^^^^^^^^^^^^^^^^^^^^^^
...
}
Fehler:
passing `const MatVec' as `this' argument of `int MatVec::getirgendwas()'
discards qualifiers
habe MatVec::getirgendwas auch mal const deklariert, brachte aber keine
Lösung. Compiler: aktueller g++ unter linux.
Ohne const geht alles klar. Wiso 'soll' ich hier überhaupt const anwenden?
Nur um sicherzustellen, das das Objekt nicht modifiziert wird?
Ratschlag?
Gruß
Martin
|
Wenn Du uns die Interna von MatVec::getirgendwas() mitteilen würdest,
könnten wir Dir auch helfen...
--
To get my real email adress, remove the two onkas
--
Hendrik Belitz
- Abort, Retry, Fthagn? -
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Martini Guest
|
Posted: Tue Jun 15, 2004 8:38 am Post subject: Re: Problem mit const-Deklaration beim Überladen |
|
|
hmm, habe eine Lösung gefunden:
die Memberfunktionen von MatVec, die ich im Operator verwende, müssen von
konstanten Objekten aufgerufen werden können.
Damit dies möglich ist, muß die Memberfunction als Elementfunktion
deklariert werden, die für konstante Objekte aufgerufen werden kann. Eine solche
Konstanten-Elementfunktion (engl.: constant member function) wird durch das
Schlüsselwort "const" zwischen Parameterliste und Funktionskörper deklariert:
Deklaration:
class MatVec {
....
int MatVec::getirgendwas()const;
....
}
Definition:
int MatVec::getirgendwas()const {
....
};
so stands sinngemäß jedenfalls in
http://www.numerik.uni-kiel.de/~hkw/privat/c++info.html,
wie ich finde, eine recht aufschlussreiche Seite über das Operatorüberladen
und const-Deklarationen wenn man da noch newbie ist.
Gruß
Martin
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Gerhard Wesp Guest
|
Posted: Tue Jun 15, 2004 8:43 am Post subject: Re: Problem mit const-Deklaration beim Überladen |
|
|
Martini <idabich (AT) freenet (DOT) de> wrote:
| Quote: | passing `const MatVec' as `this' argument of `int MatVec::getirgendwas()'
discards qualifiers
|
Kann es sein, dass du in getirgendwas() versuchst, den Zustand des
MatVec zu aendern?
| Quote: | Ohne const geht alles klar. Wiso 'soll' ich hier überhaupt const anwenden? Nur
um sicherzustellen, das das Objekt nicht modifiziert wird?
|
Im Prinzip ja. const ist ein Designfehler in C++. Besser waere es,
Objekten per default das const-Attribut zu geben und ein Schluesselwort
``variable'' einzufuehren, das Objekte veraenderbar macht.
Zumindest in meinem Code sind die meisten ``Variablen'' in Wirklichkeit
Konstanten. :-)
-Gerhard
--
Gerhard Wesp o o Tel.: +41 (0) 43 5347636
Bachtobelstrasse 56 | http://www.cosy.sbg.ac.at/~gwesp/
CH-8045 Zuerich _/ See homepage for email address!
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Martini Guest
|
Posted: Tue Jun 15, 2004 9:01 am Post subject: Re: Problem mit const-Deklaration beim Überladen |
|
|
Hendrik Belitz <honkaonka.belitz (AT) fz-juelich (DOT) de> wrote:
| Quote: |
Wenn Du uns die Interna von MatVec::getirgendwas() mitteilen würdest,
könnten wir Dir auch helfen...
|
Die Interna (abgesehen von der Dekl.) Spielen keine Rolle, selbst wenn's
lediglich ein MatVec::getirgendwas(){return 0;}; ist, klappts nicht.
Ok, dummer Satz eigendlich, Deklaration gehört wohl extrem zu den Interna
einer Funktion, hatte ich nicht bedacht, sorry.
Jetzt aber gelöst: int MatVec::getirgendwas()const;
Also, Mit den korrekten Deklarationen ist für'n newbie jedenfalls nicht ohne...
Gibt's da 'ne gute Seite im Netz? Und überhaupt: Es gibt ja soviele c++-Links.
Weiss jemand, welche Onlineseiten für Leute wie mich eine wahre Fundgrube sein
könnten?
Gruß
Martin
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Hendrik Belitz Guest
|
Posted: Tue Jun 15, 2004 9:03 am Post subject: Re: Problem mit const-Deklaration beim Überladen |
|
|
Gerhard Wesp wrote:
| Quote: | Im Prinzip ja. const ist ein Designfehler in C++. Besser waere es,
Objekten per default das const-Attribut zu geben und ein Schluesselwort
``variable'' einzufuehren, das Objekte veraenderbar macht.
|
Hmm, der Sinn eines Objektes ist es doch eigentlich, einen veränderbaren
Zustand zu haben. Pauschal alles erstmal const zu machen ist da irgendwie
nicht so die tollste Idee...
--
To get my real email adress, remove the two onkas
--
Hendrik Belitz
- Abort, Retry, Fthagn? -
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Markus Breuer Guest
|
Posted: Tue Jun 15, 2004 10:29 am Post subject: Re: Problem mit const-Deklaration beim Überladen |
|
|
Martini schrieb:
| Quote: | Hallo,
ich habe ein Problem mit einem const-Argument beim Überladen vom
Ausgabeoperator:
ostream& operator<<(ostream& Stream,const MatVec &matvec){
matvec.getirgendwas();
^^^^^^^^^^^^^^^^^^^^^^
...
}
Fehler:
passing `const MatVec' as `this' argument of `int MatVec::getirgendwas()'
discards qualifiers
habe MatVec::getirgendwas auch mal const deklariert, brachte aber keine
Lösung. Compiler: aktueller g++ unter linux.
|
Wenn du "void MatVec::getirgendwas() const" deklariert hast, meckert der
Compiler an dieser Stelle nicht. Wenn du beispielsweise
int* MatVec::getirgendwas() const
{
return &m_member_int;
}
verwendest, meckert der Compiler an einer anderes Stelle: Du versprichst
mit dem const am Ende der Funktion "Ich ändere nichts am Inhalt der
Klasse", gibst dann aber einenn int* zurück, der dann doch geändert
werden könnte. Richtig sähe die Funktion wie folgt aus:
// man achte auf das const
const int* MatVec::getirgendwas() const
{
return &m_member_int;
}
| Quote: | Ohne const geht alles klar. Wiso 'soll' ich hier überhaupt const anwenden? Nur
um sicherzustellen, das das Objekt nicht modifiziert wird?
|
Das const kennzeichnet "hier wird semantisch nichts geändert". Mit dem
const in der der Argumentliste sagst du dem potenziellen Benutzer deiner
Funktion "ich ändere nichts an deinem Objekt, garantiert". Der Compiler
überwacht dieses versprechen dann.
Naturlich steht es dir frei, das const wegzulassen. Jemand, der deine
Funktion nicht kennt, muss davon ausgehen "beim Aufruf wird vielleicht
doch etwas verändert". Und temporäre Objekte kannst du deiner Funktion
auch nicht mitgeben.
Als guter C++ Programmierer siehst du aber ein, const ist gut und wo der
Compiler überwacht, kannst du dich getrost zurücklehnen. Warum solltest
du dir das Leben selber schwer machen?
Gruß Markus
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Martini Guest
|
Posted: Tue Jun 15, 2004 11:01 am Post subject: Re: Problem mit const-Deklaration beim Überladen |
|
|
Danke
Markus Breuer <markus.breuer (AT) gmx (DOT) de> wrote:
| Quote: | Naturlich steht es dir frei, das const wegzulassen. Jemand, der deine
Funktion nicht kennt, muss davon ausgehen "beim Aufruf wird vielleicht
doch etwas verändert". Und temporäre Objekte kannst du deiner Funktion
auch nicht mitgeben.
Als guter C++ Programmierer siehst du aber ein, const ist gut und wo der
Compiler überwacht, kannst du dich getrost zurücklehnen. Warum solltest
du dir das Leben selber schwer machen?
Gruß Markus
|
An welcher Stelle werden temporäre Objekte mitgegeben ?
temporär -relativ zu was?
Gruß Martin
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Steffen Rauh Guest
|
Posted: Tue Jun 15, 2004 11:23 am Post subject: Re: Problem mit const-Deklaration beim 334berladenn^ |
|
|
| Quote: | Das const kennzeichnet "hier wird semantisch nichts geändert". Mit dem
const in der der Argumentliste sagst du dem potenziellen Benutzer deiner
Funktion "ich ändere nichts an deinem Objekt, garantiert". Der Compiler
überwacht dieses versprechen dann.
|
Und um dem Compiler beizubringen, wie die semantische Konstantheit genau
aussieht, sei an dieser Stelle noch auf das Keyword "mutable" hingewiesen,
welches dem Compiler quasi mitteilt, dass ein Attribut immer verändert
werden kann und dessen Veränderung keine Auswirkung auf die semantische
Konstantheit hat (z.B. bei Caching-Algorithmen unabdingbar).
MfG,
Steffen Rauh
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Markus Breuer Guest
|
Posted: Tue Jun 15, 2004 7:37 pm Post subject: Re: Problem mit const-Deklaration beim Überladen |
|
|
| Quote: | Und um dem Compiler beizubringen, wie die semantische Konstantheit genau
aussieht, sei an dieser Stelle noch auf das Keyword "mutable" hingewiesen,
welches dem Compiler quasi mitteilt, dass ein Attribut immer verändert
werden kann und dessen Veränderung keine Auswirkung auf die semantische
Konstantheit hat (z.B. bei Caching-Algorithmen unabdingbar).
|
Genau, semantische Konststantheit besagt "an der logischen
Repräsentation" nach aussen hin ändert sich nichts. Physikalisch darf
geändert werden, u.a. also bei mutable. Falls der Compiler dieses
Schlüsselwort nicht unterstützt gibt es noch den const-cast.
Gruß Markus
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Markus Breuer Guest
|
Posted: Tue Jun 15, 2004 7:39 pm Post subject: Re: Problem mit const-Deklaration beim Überladen |
|
|
Martini schrieb:
| Quote: | An welcher Stelle werden temporäre Objekte mitgegeben ?
temporär -relativ zu was?
|
Beispiel:
struct foo {};
std::cout << foo(); // erzeugt ein temporäres Objekt vom Typ foo
Gruß Markus
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Tue Jun 15, 2004 7:58 pm Post subject: Re: Problem mit const-Deklaration beim Überladen |
|
|
Steffen Rauh wrote:
| Quote: | Das const kennzeichnet "hier wird semantisch nichts geändert". Mit
dem const in der der Argumentliste sagst du dem potenziellen Benutzer
deiner Funktion "ich ändere nichts an deinem Objekt, garantiert". Der
Compiler überwacht dieses versprechen dann.
Und um dem Compiler beizubringen, wie die semantische Konstantheit
genau aussieht, sei an dieser Stelle noch auf das Keyword "mutable"
hingewiesen, welches dem Compiler quasi mitteilt, dass ein Attribut
immer verändert werden kann und dessen Veränderung keine Auswirkung
auf die semantische Konstantheit hat (z.B. bei Caching-Algorithmen
unabdingbar).
|
Unabdingbar würde ich nicht sagen. Man kann immer einen Zeiger als
Member halten. Die Konstantheit des Zeigers sagt ja nichts über die
Konstantheit des Objekts aus, worauf er zeigt. Ich kann also in einem
konstanten Objekt auch ohne mutable meinen Cache updaten.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Steffen Rauh Guest
|
Posted: Tue Jun 15, 2004 8:33 pm Post subject: Re: Problem mit const-Deklaration beim 334berladenn^ |
|
|
| Quote: | Unabdingbar würde ich nicht sagen. Man kann immer einen Zeiger als
Member halten. Die Konstantheit des Zeigers sagt ja nichts über die
Konstantheit des Objekts aus, worauf er zeigt. Ich kann also in einem
konstanten Objekt auch ohne mutable meinen Cache updaten.
|
Kommt darauf an, wie man const verwendet:
// Zeiger auf konstantes Objekt
const CObject* MyObject;
// Konstanter Zeiger auf konstantes Objekt
const CObject *const MyObject;
// Konstanter Zeiger
CObject *const MyObject;
Und wenn ein Zeiger auf ein konstantes Objekt zeigt, kann der Compiler
ebenfalls wieder auf Konstantheit prüfen. Mir ist nicht ganz klar, wie das
von dir vorgeschlagene Verfahren über einen Zeiger auf ein Objekt genau
funktionieren soll. Ich hab' an solche Dinge gedacht:
class CString
{
protected:
char* m_Data;
mutable unsigned int m_Length;
mutable bool m_Cached;
protected:
void CalcLength() const
{
unsigned int FoundLength = 0;
// m_Data nach absuchen
m_Length = FoundLength;
m_Cached = true;
}
public:
CString()
{
m_Data = 0;
m_Length = 0;
m_Cached = false;
}
unsigned int Length() const
{
if (m_Cached)
{
return m_Length;
}
else
{
CalcLength();
return m_Length;
}
}
};
Ist jetzt nur so runtergeschrieben ohne im Compiler getestet zu haben. Wenn
Fehler drin sind, darf sie der Finder behalten.
Wie kann ich hier jetzt ohne mutable und mit deinen Zeigern arbeiten und
dennoch maximale Sicherheit gewährleisten?
MfG,
Steffen Rauh
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Steffen Rauh Guest
|
Posted: Tue Jun 15, 2004 8:33 pm Post subject: Re: Problem mit const-Deklaration beim 334berladenn^ |
|
|
| Quote: | Genau, semantische Konststantheit besagt "an der logischen
Repräsentation" nach aussen hin ändert sich nichts. Physikalisch darf
geändert werden, u.a. also bei mutable. Falls der Compiler dieses
Schlüsselwort nicht unterstützt gibt es noch den const-cast.
|
Aber auch nur als äußerst brachialen Notanker.
Kennst du einen Compiler, der dieses Schlüsselwort nicht unterstützt? Ich
würde erwarten, dass jeder ernsthafter Compiler dieses Schlüsselwort
unterstützt, da es (mit private, protected und public zusammen) die
fundamentalen Zugriffsrechte auf ein Objekt regelt.
MfG,
Steffen Rauh
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Tobias Wollgam Guest
|
Posted: Wed Jun 16, 2004 8:11 am Post subject: Re: Problem mit const-Deklaration beim Überladen |
|
|
| Quote: | Unabdingbar würde ich nicht sagen. Man kann immer einen Zeiger als
Member halten. Die Konstantheit des Zeigers sagt ja nichts über die
Konstantheit des Objekts aus, worauf er zeigt. Ich kann also in einem
konstanten Objekt auch ohne mutable meinen Cache updaten.
|
Wie das?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|