 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Torsten Robitzki Guest
|
Posted: Mon Apr 05, 2004 8:05 pm Post subject: virtual bool operator==() |
|
|
Hi,
ganz einfache Frage. Bin gerade dabei, eine Liste von Objekten einer
bestimmten Basisklasse (Typen) mit einer anderen zu vergleichen. Was ich
in google gefunden habe, ist nur verwirrend. Mein Vergleich geht davon
aus, das Objekte unterschiedlicher Typen nicht gleich sein können; von
daher scheidet double dispatching eigentlich schon mal aus.
struct base {
virtual bool operator==(const base&) const = 0;
};
struct derivedX : base
{
int member;
virtual bool operator==(const base& rhs) const
{
const base* other = dynamic_cast<const derivedX*>(&rhs);
return other != 0 && member == other->member;
}
};
scheint mir ein gangbares pattern zu sein. Wieso finde ich diese Lösung
kaum, wenn ich via google suche?
mfg Torsten
--
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 Schaaf Guest
|
Posted: Mon Apr 05, 2004 10:18 pm Post subject: Re: virtual bool operator==() |
|
|
"Torsten Robitzki" <firstname (AT) lastname (DOT) de> schrieb:
| Quote: | aus, das Objekte unterschiedlicher Typen nicht gleich sein können; von
daher scheidet double dispatching eigentlich schon mal aus.
struct base {
virtual bool operator==(const base&) const = 0;
};
struct derivedX : base
{
int member;
virtual bool operator==(const base& rhs) const
{
const base* other = dynamic_cast<const derivedX*>(&rhs);
return other != 0 && member == other->member;
}
};
scheint mir ein gangbares pattern zu sein. Wieso finde ich diese Lösung
kaum, wenn ich via google suche?
|
Weil das nur eine Spielart von Double-Dispatch ist. Der erste Dispatch
ist der Aufruf des virtuellen Operators, der zweite der »dynamic_cast«.
Viele der Probleme, die die Multi-Dispatcher zu lösen versuchen, hast
Du vielleicht gar nicht. -- Eine Variante, die mit Sicherheit näher an
Deiner Spezifikation wäre:
struct derivedX : base
{
int member;
bool operator == ( const derivedX& o ) const {
return member == static_cast< derivedX const& >(o).member;
}
bool operator == ( const base& o ) const {
return typeid(o) == typeid(*this)
&& operator == ( static_cast< derivedX const& >(o) );
}
};
(Für den Fall, daß die Hierarchie nicht flach ist.)
--
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
|
|