 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Uwe Stein Guest
|
Posted: Mon May 24, 2004 6:56 pm Post subject: Überladener ++Operator Präfix / Postfix ?? |
|
|
Hallo NG,
ich habe zu DOS-Zeiten mal in C/C++ programmiert und Versuche jetzt
wieder reinzukommen. ( Ist alles doch schon sehr in Vergessenheit geraten)
Zum Einstieg versuche ich mich an einer Datums-Klasse und hänge jetzt
beim überladenen Operator++.
Frage: Wie bekomme ich die Unterscheidung Postfix - Präfix hin ??
Auszug aus der m_date.h:
m_date &operator++(void);
m_date &operator++(int dummy); // soll Postfix sein.
m_date &add_day(void);
Auszug aus m_date.cpp:
// soll Postfix sein
m_date &m_date::operator++( int dummy )
{
return add_day();
}
// soll Präfix sein
m_date &m_date::operator++( void )
{
return add_day();
}
m_date &m_date::add_day(void)
{
{...
// addiert nach Plausi-Prüfung einen Tag
...
}
return *this;
}
Beim Probelauf funktiniert das ganze, allerdings bei beiden
Schreibweisen immer nur als Präfix-Variante. Bei den Operator-Funktionen
muß wohl irgendetwas anders kodiert werden. ( aber was ? )
Danke im Voraus für euere Hilfe.
Gruß Uwe
--
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: Mon May 24, 2004 11:15 pm Post subject: Re: Überladener ++Operator Präfix / Postfix ?? |
|
|
Uwe Stein wrote:
| Quote: | Hallo NG,
ich habe zu DOS-Zeiten mal in C/C++ programmiert und Versuche jetzt
wieder reinzukommen. ( Ist alles doch schon sehr in Vergessenheit
geraten)
Zum Einstieg versuche ich mich an einer Datums-Klasse und hänge jetzt
beim überladenen Operator++.
Frage: Wie bekomme ich die Unterscheidung Postfix - Präfix hin ??
Auszug aus der m_date.h:
m_date &operator++(void);
m_date &operator++(int dummy); // soll Postfix sein.
|
So ist es auch richtig. Einen Namen brauchst du dem int-Parameter aber
gar nicht zu geben.
| Quote: | m_date &add_day(void);
Auszug aus m_date.cpp:
// soll Postfix sein
m_date &m_date::operator++( int dummy )
{
return add_day();
}
// soll Präfix sein
m_date &m_date::operator++( void )
{
return add_day();
}
m_date &m_date::add_day(void)
{
{...
// addiert nach Plausi-Prüfung einen Tag
...
}
return *this;
}
Beim Probelauf funktiniert das ganze, allerdings bei beiden
Schreibweisen immer nur als Präfix-Variante.
|
Naja, du hast beide gleich implementiert, nämlich so wie die
Präfix-Variante aussehen soll. Wieso erwartest du dann, daß sie sich
unterschiedlich verhalten?
| Quote: | Bei den Operator-Funktionen muß wohl irgendetwas anders kodiert
werden. ( aber was ? )
|
Naja, der Postfix-Operator soll ja den vorherigen Wert zurückgeben und
nicht den neuen. Also kopierst du einfach dein date vor dem
Inkrementieren und gibst die Kopie dann zurück.
--
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 |
|
 |
Uwe Stein Guest
|
Posted: Tue May 25, 2004 6:50 am Post subject: Re: Überladener ++Operator Präfix / Postfix ?? |
|
|
| Quote: |
Naja, der Postfix-Operator soll ja den vorherigen Wert zurückgeben und
nicht den neuen. Also kopierst du einfach dein date vor dem
Inkrementieren und gibst die Kopie dann zurück.
|
Es kann ja so einfach sein, wenn man logisch überlegt.
( Man muss es aber auch machen. )
Danke für die Hilfe
Gruß Uwe
--
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 |
|
 |
Daniel Rentz Guest
|
Posted: Tue May 25, 2004 11:07 am Post subject: Re: Überladener ++Operator Präfix / Postfix ?? |
|
|
Hi,
Rolf Magnus schrieb:
| Quote: | Auszug aus der m_date.h:
m_date &operator++(void);
m_date &operator++(int dummy); // soll Postfix sein.
So ist es auch richtig. Einen Namen brauchst du dem int-Parameter aber
gar nicht zu geben.
|
Nicht ganz...
const m_date operator++(int) const
{
return m_date( *this ).add_day();
}
Keine Referenz zurückgeben, sondern temporäres Objekt! Das am besten
const machen, damit so Sachen wie "my_date ++ ++" nicht gültig sind.
Ciao
Daniel
--
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 |
|
 |
Daniel Albuschat Guest
|
Posted: Tue May 25, 2004 11:57 am Post subject: Re: Überladener ++Operator Präfix / Postfix ?? |
|
|
Daniel Rentz wrote:
| Quote: | const m_date operator++(int) const
{
return m_date( *this ).add_day();
}
Keine Referenz zurückgeben, sondern temporäres Objekt! Das am besten
const machen, damit so Sachen wie "my_date ++ ++" nicht gültig sind.
|
Klar geht so "my_date ++ ++", weil operator++ bei dir ja const
ist.
Das darf natuerlich ueberhaupt nicht sein, da ++ ja nicht nur ein
inkrementiertes Objekt zurueckgibt, sondern sich selbst auch
inkrementiert. Das fehlt in deinem Operator. Es muesste eher
const m_date operator++(int)
{
m_date result(*this);
this->add_day();
return result;
}
heissen, wenn ich das richtig verstehe.
Uebrigens war ich bisher der Meinung, dass der Aufruf von
operator++(int) das schon so macht, dass zuerst das aktuelle Objekt
zurueckgegeben wird, und danach operator++ erst auf das Objekt
aufgerufen wird. D.h. dass die Implementierung von operator++() und
operator++(int) gleich sein kann/sollte.
Aber laut Aussage von anderen Postern habe ich mich wohl getaeuscht...
Fuer sinnvoll hielte ich es allerdings.
MfG,
Daniel Albuschat
--
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 |
|
 |
Daniel Rentz Guest
|
Posted: Tue May 25, 2004 2:32 pm Post subject: Re: Überladener ++Operator Präfix / Postfix ?? |
|
|
Hi Daniel,
Daniel Albuschat schrieb:
| Quote: | Klar geht so "my_date ++ ++", weil operator++ bei dir ja const
ist.
Das darf natuerlich ueberhaupt nicht sein, da ++ ja nicht nur ein
inkrementiertes Objekt zurueckgibt, sondern sich selbst auch
inkrementiert. Das fehlt in deinem Operator. Es muesste eher
const m_date operator++(int)
{
m_date result(*this);
this->add_day();
return result;
}
|
Jajajaja, hast ja vollkommen recht <stirn-patsch>. Siehste mal, wie oft
ich post-increment Operatoren benutze/implementiere... :-)
Ciao
Daniel
--
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 |
|
 |
Lars H. Rohwedder Guest
|
Posted: Tue May 25, 2004 9:02 pm Post subject: Re: Überladener ++OperatorPräfix / Postfix ?? |
|
|
| Quote: | Keine Referenz zurückgeben, sondern temporäres Objekt! Das am besten
const machen, damit so Sachen wie "my_date ++ ++" nicht gültig sind.
|
Was ist denn daran so verwerflich? Insgesondere, wenn ein operator+= fehlt,
weil man normalerweise halt nur ein einfaches Inkrement braucht (und ein
operator+= möglicherweise teuer wäre), aber nun doch _ausnahmsweise_ mal ein
Doppel-Inkrement... ist das denn so weit hergeholt?
| Quote: | Uebrigens war ich bisher der Meinung, dass der Aufruf von
operator++(int) das schon so macht, dass zuerst das aktuelle Objekt
zurueckgegeben wird, und danach operator++ erst auf das Objekt
aufgerufen wird. D.h. dass die Implementierung von operator++() und
operator++(int) gleich sein kann/sollte.
Aber laut Aussage von anderen Postern habe ich mich wohl getaeuscht...
|
Man lernt halt nie aus. :-)
| Quote: | Fuer sinnvoll hielte ich es allerdings.
|
Hm, ich irgendwie auch. Das würde einerseits die Implementierung von
Operatoren vereinfachen, aber andererseits die Möglichkeiten einschränken,
da dann eben nur noch Operatorfunktionen möglich wären, die halt die
Funktionalität des internen Postinkrement-Operators nachbilden. Mit dieser
Einschränkung könnte _ich_ gut leben, da ich finde, dass benutzerdefinierte
Operatoren eben nur dies tun sollen. Aber vielleicht mag es ja berechtigte
Anwendungsfälle geben, wo ein selbstdefinierter Operator halt eine gänzlich
andere Semantik besitzt als die eingebauten Operatoren.
Gruß,
Lars R.
--
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 |
|
 |
Daniel Rentz Guest
|
Posted: Wed May 26, 2004 6:07 am Post subject: Re: Überladener ++Operator Präfix / Postfix ?? |
|
|
Hi,
Lars H. Rohwedder schrieb:
| Quote: | Keine Referenz zurückgeben, sondern temporäres Objekt! Das am besten
const machen, damit so Sachen wie "my_date ++ ++" nicht gültig sind.
Was ist denn daran so verwerflich? Insgesondere, wenn ein operator+= fehlt,
weil man normalerweise halt nur ein einfaches Inkrement braucht (und ein
operator+= möglicherweise teuer wäre), aber nun doch _ausnahmsweise_ mal ein
Doppel-Inkrement... ist das denn so weit hergeholt?
|
Es ist eben kein Doppelinkrement. "my_date++" erhöht my_date, aber
liefert ein temporäres Objekt mit dem alten Wert. "my_date++++" erhöht
also das temporäre Objekt, my_date selbst bleibt beim zweiten ++
unverändert...
Ciao
Daniel
--
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: Wed May 26, 2004 10:13 am Post subject: Re: Überladener ++Operator Präfix / Postfix ?? |
|
|
Daniel Rentz wrote:
| Quote: | Keine Referenz zurückgeben, sondern temporäres Objekt! Das am
besten const machen, damit so Sachen wie "my_date ++ ++" nicht
gültig sind.
Was ist denn daran so verwerflich? Insgesondere, wenn ein operator+=
fehlt, weil man normalerweise halt nur ein einfaches Inkrement
braucht (und ein operator+= möglicherweise teuer wäre), aber nun doch
_ausnahmsweise_ mal ein Doppel-Inkrement... ist das denn so weit
hergeholt?
Es ist eben kein Doppelinkrement. "my_date++" erhöht my_date, aber
liefert ein temporäres Objekt mit dem alten Wert. "my_date++++" erhöht
also das temporäre Objekt, my_date selbst bleibt beim zweiten ++
unverändert...
|
Im Zweifelsfall ist es außerdem meistens eine gute Idee, dem Motto "do
it as int does" zu folgen.
Übrigens: Bei Prefix-Inkrement wäre es anders. ++++my_date würde
tatsächlich das Datum zweimal inkrementieren, sofern man eine Referenz
zurückgibt (Was man auch tun sollte). Es wäre abgesehen davon auch
performanter, weil keine unnötigen Kopien erzeugt werden.
--
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
|
|