2011-01-03 7 views
0

welche Operatoren des Vergleichs (< =,>, ==, etc.) tun Sie in der Regel als Ihre Basisoperatoren, die Sie nach der Verwendung der Restvergleichsoperatoren implementieren oder alle möglichen Vergleiche zwischen den Klassen vornehmen können?Was ist die Mindestanzahl an Operatoren, die ich überlasten muss?

+1

Vielleicht möchten Sie einen Blick auf die große FAQ zum Überladen von Operatoren (http://stackoverflow.com/questions/4421706/operator-overloading/4421719#4421719) werfen, die auch Ihre Frage behandelt. –

Antwort

7

Sie können alle sechs des Betreibers in Bezug auf == implementieren und < folgende Äquivalenzen mit:

a != b => !(a == b) 
a > b  => b < a 
a >= b => !(a < b) 
a <= b => !(b < a) 
+2

Sie können das auch nur mit dem Operator

2

Für Klassen, in denen sie anwendbar sind in der Regel operator< und operator== ich implementieren „nativ“ wegen ihrer Bedeutung in Standardalgorithmen und Container.

Ich dann implementieren die anderen vier in Bezug auf diese.

Ein weiterer Ansatz, den ich manchmal prüfen, ist ein „Vergleich“ Funktion implementiert, die 1, 0 oder -1 im Stil strcmp und das Gerät alle anderen Betreiber in Bezug auf diese zurückgibt. Ich tue das nur, wenn operator< und operator== so aussehen, als müssten sie viel vom gleichen Code teilen, was weniger oft vorkommt, als ich denke.

2

Ich normalerweise implementieren operator== für Objekte und auch operator!=. Viele Objekte haben keine Sortierfolge, daher sind die Vergleichsoperatoren <, < =,>,> = nicht sinnvoll.

Außerdem müssen unter Verwendung von boost::equality_comparable und boost::less_than_comparable nur operator== und operator< implementiert werden. Diese können in boost/operators.hpp gefunden werden.

Außerdem habe ich gelernt, dass das Platzieren von Vergleichsoperatoren in Basisklassen oder Interface-Klassen ziemlich kompliziert werden kann, da sie Descendent_A mit Descendent_B vergleichen können, die zwei verschiedene abgeleitete Klassen sind.

Vergleichsoperatoren sollten nach Bedarf in Klassen implementiert werden. Viele Klassen brauchen sie nicht. Achten Sie auch darauf, sie zu implementieren oder in Basisklassen zu definieren, ohne die Auswirkungen der Vererbung zu berücksichtigen.

Verwandte Themen