Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

04.02.2014, 21:08

Globale Operatoren

Hallo Zusammen,

da ich letztens öfters mal drüber gestolpert bin.

Warum macht man Globale Operatoren wenn beide Parameter der selben klasse Angehören?
als Beispiel diene hier mal etwas aus der Bekannten SFML

C-/C++-Quelltext

1
bool operator ==(const VideoMode& left, const VideoMode& right)


Also konkret gefragt welche Vorteile bringt diese Methode gegenüber der Implementierung als Member der Klasse?

Danke schon im voraus.

Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

2

04.02.2014, 21:28

Andere Kapselung und sich vor der Neukompilierung drücken.
EDIT: und natürlich das, was David unter mir gepostet hat.

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

04.02.2014, 21:38

David: Das trifft hier nicht zu, da beide Operanden vom selben Typ sind. Das war integraler Bestandteil der Frage. Generell gilt in jedem C++ Guide, dass man eine non-member-Variante machen sollte, wenn beide Operanden vom selben Typ sind und man keinen Zugriff auf private Member braucht.
Mir ist aber auch nicht so ganz klar warum. Kapselung sehe ich irgendwie nicht als passend, denn eigentlich tut man ja das Gegenteil - man lagert eine Operation aus, die eigentlich nur diese Klasse betrifft - irgendwie doch kontrovers.
Neukompilierung ist auch ein schlechtes Argument, denn kompilieren muss man so oder so.
Also warum empfehlen es alle Guides?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

04.02.2014, 22:47

Laurent hebt sogar extra hervor, dass sie nicht Member sind.
Weder sinnvoll für implizite Konvertierung in dem Fall noch sonst was. Sehr suspekt.
@Cobold: Das mit der Kapselung war mehr Troll/äußerst kurz gedacht. std::string implementiert den operator< ja nicht "von selbst", man muss string einbinden, wo es kürzlich, wenn ich das nun nicht verwechsle, ja auch den schönen Fall gab, dass das bei der Implementierung einer std::map mit std::string als Key nicht funktionierte, weil der opertaor< nicht gefunden wurde. In der Art dachte ich daran. *face->desk*
hm.

MfG
Check

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

04.02.2014, 23:47

Ein weiterer Grund – abgesehen davon, dass freie Funktionen prinzipiell zu bevorzugen sind (http://www.drdobbs.com/cpp/how-non-membe…capsu/184401197) – ist, dass bei der Variante mit der freien Funktion für beide Operanden implizite Konvertierungen berücksichtigt werden, während bei einer Implementierung als Memberfunktion nur der rechte Operand konvertiert werden kann. Wäre beispielsweise der operator + für std::string als Memberfunktion implementiert, so könnte man string + "blub" schreiben, aber nicht "blub" + string...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (05.02.2014, 00:07)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

05.02.2014, 06:36

Die implizite Konvertierung ist hier aber auch recht sinnfrei und in vielen anderen Fällen vermutlich ebenfalls. Implizite Konvertierungen sind außer bei sehr trivialen Datentypen ja doch eher selten (zumindest, wenn es == betrifft und man eben nicht-mathematische Dinge vergleicht, was außerhalb der Spiele-Entwicklung irgendwie immer der Fall ist). Bisher fehlt mir daher für diese Richtlinie doch irgendwie noch der Aha-Effekt. Sicher, all die Punkte, die ihr ansprecht, haben ihre Berechtigung. Aber eben nur in sehr speziellen Umständen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

8

05.02.2014, 20:17

Hallo zusammen,

danke erst mal für die Antworten.

Habe mir die links angeschaut aber einen wirklichen Grund habe ich da nicht rauslesen können im Sinne von "ist besser weil...".

Dot: Dein Beispiel mit "Blub" + String hingt auch wieder, weil "Blub" ja kein String wäre. Das man so was braucht ist mir bewusst, aber ich hatte gefragt warum man es bei Operatoren macht wo beide Operanden der gleichen Klasse angehören.

Also wenn noch jemand was hat nur her damit :)

Danke und Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

05.02.2014, 20:37

Dot: Dein Beispiel mit "Blub" + String hingt auch wieder, weil "Blub" ja kein String wäre. Das man so was braucht ist mir bewusst, aber ich hatte gefragt warum man es bei Operatoren macht wo beide Operanden der gleichen Klasse angehören.

Das ist ja gerade der Punkt. "blub" ist kein std::string, std::string hat aber einen Konstruktor, der ein char Array nimmt, d.h. es existiert eine implizite Umwandlung von char Array nach std::string, welche der Compiler bei der Variante mit der freien Funktion verwenden kann... ;)

10

05.02.2014, 20:54

Wie gesagt Dot der nutzen ist mir vollkommen klar. Ich möchte aber weg von Fallbeispielen wie..

C-/C++-Quelltext

1
2
3
std::string operator+ (const char* lh, const std::string& rh);
// oder
Vector2D operator* (const int lh, const Vector2D& rh);

hinzu

C-/C++-Quelltext

1
2
3
4
// um mal beim Vector zu bleiben
Vector2D operator* (const Vector2D& lh, const Vector2D& rh);
// oder
bool operator< (const Vector2D& lh, const Vector2D& rh);


Also warum hat diese Implementierung Vorteile gegenüber der Methode als Member-Funktion

C-/C++-Quelltext

1
2
3
Vector2D Vector2D::operator* (const Vector2D& rh);
// oder
bool Vector2D::operator< (const Vector2D& rh);


Ist es nur ein Philosophische frage oder hat es einen greifbaren technischen Vorteil?
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Werbeanzeige