Overloading design Frage



  • Hallo liebe Forengemeinde,

    ich schreibe gerade meine eigene Vector2D Klasse. Ich habe in den FAQ den Beitrag zum Überladen gelesen und nun noch eineige Fragen. Ich würde gerne wissen, in welcher Art ich welche Operatoren am Besten überladen sollte:

    1.) Welche Operatoren sollten member-Funktionen sein? Ich habe nur die Operatoren +=,-=,=,/=. Die +-/ würden das Objekt ja nicht verändern...
    2.) Wann sollte ich eine Version angeben, die ein konstantes Objekt zurück gibt?(Referenz darauf natürlich) Nur für die +=,-=,=,/= oder auch für +-/ oder garnicht?
    3.) Sollten die +-/ Operatoren konstante Funktionen sein?
    4.) Welche Operatoren sollte befreundete Nicht-member-Funktionen sein? Ich habe mich für ==,!=,+-
    / entschieden. Auch hier wieder sollten sie konstant sein und der Rückgabetyp ebenfalls?
    5.) Sollten Operatoren generell inline sein?
    6.) die letzte Frage bezieht sich nicht auf Operaten, sondern auf statische Funktionen. Was ist vom Design besser:

    static float dotProduct(const Vector2D&, const Vector2D&);
    //oder
    float dotProduct(const Vector2D&);
    

    Hoffe ihr könnt mir ein paar Fragen beantworten 👍


  • Mod

    Vieles, wenn nicht alles, sollte mit Begründung und Beispielen hier zu finden sein:
    http://www.c-plusplus.net/forum/232010
    http://www.c-plusplus.net/forum/240706
    (oder waren diese Seiten schon das, was du mit FAQ meintest? Da drin steht jedenfalls vieles von dem was du gefragt hast beantwortet)



  • BootLag-BootLag- schrieb:

    1.) Welche Operatoren sollten member-Funktionen sein? Ich habe nur die Operatoren +=,-=,=,/=. Die +-/ würden das Objekt ja nicht verändern...

    Steht im ersten Link von SeppJ

    2.) Wann sollte ich eine Version angeben, die ein konstantes Objekt zurück gibt?(Referenz darauf natürlich) Nur für die +=,-=,=,/= oder auch für +-/ oder garnicht?

    - Konstantes Objekt: garnicht. Es gab mal Vertreter der Meinung, dass a+b ein konstantes Objekt zurückgeben sollte, allerdings hat sich das mit C++0x erledigt, da zurückgegebene konstante Objekte rvalues sind, aber nicht mit rvalue-Referenz-Parameter binden, da die non-const sind, um den rvalue ggf. moven zu können.
    - Konstante Referenz: erst recht nicht, schon garnicht bei den von dir angesprochenen Operatoren. += &Co. verändern das Objekt ja schon, wäre unlogisch, wenn die Rückgabe dann eine const-referenz auf das gradenoch veränderbare Objekt wäre. +, - &Co. erzeugen ein neues Objekt, da eine const Ref drauf zurückzugeben wäre schlichtweg falsch, weils sofort eine hängende Referenz wäre.
    Welchen Typ die Rückgabe richtigerweise haben sollte zeigt auch Sepps erster Link

    3.) Sollten die +-/ Operatoren konstante Funktionen sein?
    4.) Welche Operatoren sollte befreundete Nicht-member-Funktionen sein? Ich habe mich für ==,!=,+-
    / entschieden. Auch hier wieder sollten sie konstant sein und der Rückgabetyp ebenfalls?

    Siehe erster Link.

    5.) Sollten Operatoren generell inline sein?

    Nein. inline ist nie mehr als ein freundlicher Hinweis an den Compiler, der aber sowieso besser weiß, was er am Besten inlined und was nicht. Einziger Anwendungsfall für inline ist heutzutage nurnoch das Schreiben von Header-only-Bibliotheken (und -Klassen, wenns denn sein muss).

    6.) die letzte Frage bezieht sich nicht auf Operaten, sondern auf statische Funktionen. Was ist vom Design besser:

    static float dotProduct(const Vector2D&, const Vector2D&);
    //oder
    float dotProduct(const Vector2D&);
    

    Das sind zwei völlig unterschiedliche Funktionen. static hat außerdem zwei sehr unterschiedliche Bedeutungen, je nachdem ob es in einer Klasse oder im namespace-scope steht. Die Frage ist so also nicht zu beantworten.



  • Ok ich werde mir mal die Links ansehen. Danke für eure Hilfe 👍


Log in to reply