C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Überladener ++Operator Präfix / Postfix ??

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Uwe Stein
Guest





PostPosted: Mon May 24, 2004 6:56 pm    Post subject: Überladener ++Operator Präfix / Postfix ?? Reply with 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.
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





PostPosted: Mon May 24, 2004 11:15 pm    Post subject: Re: Überladener ++Operator Präfix / Postfix ?? Reply with quote



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





PostPosted: Tue May 25, 2004 6:50 am    Post subject: Re: Überladener ++Operator Präfix / Postfix ?? Reply with quote





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





PostPosted: Tue May 25, 2004 11:07 am    Post subject: Re: Überladener ++Operator Präfix / Postfix ?? Reply with quote

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





PostPosted: Tue May 25, 2004 11:57 am    Post subject: Re: Überladener ++Operator Präfix / Postfix ?? Reply with quote

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. Wink
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





PostPosted: Tue May 25, 2004 2:32 pm    Post subject: Re: Überladener ++Operator Präfix / Postfix ?? Reply with quote

Hi Daniel,

Daniel Albuschat schrieb:

Quote:
Klar geht so "my_date ++ ++", weil operator++ bei dir ja const
ist. Wink
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





PostPosted: Tue May 25, 2004 9:02 pm    Post subject: Re: Überladener ++OperatorPräfix / Postfix ?? Reply with quote

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





PostPosted: Wed May 26, 2004 6:07 am    Post subject: Re: Überladener ++Operator Präfix / Postfix ?? Reply with quote

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





PostPosted: Wed May 26, 2004 10:13 am    Post subject: Re: Überladener ++Operator Präfix / Postfix ?? Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.