Operatorfunktionen mit konstanten Objekten



  • Hallo Leute,

    ich habe ein paar Operatorfunktionen innerhalb/außerhalb der Klasse, welche Punkte im dreidimensionalen
    Raum darstellen soll, angelegt:

    class Point3D
    {
    private:
        double xcomp, ycomp, zcomp;
    
    public:
    
        Point3D(double x = 0, double y = 0, double z = 0) :xcomp(x), ycomp(y), zcomp(z)
        {}   
     
    
        Point3D& operator+=(const Point3D& point1)
        {
            xcomp += point1.xcomp;
            ycomp += point1.ycomp;
            zcomp += point1.zcomp;
            return *this;
        }   
    
        friend double operator*(Point3D&, Point3D&);
    };
    
    
    inline Point3D& operator+(const Point3D& point1,const Point3D& point2)
    {
        Point3D point(point1);
        point += point2;
        return point;
    }
    
    
    inline Point3D& operator*(const Point3D& point1, int c)
    {
        Point3D point(point1);
        point *= c;
        return point;
    
    }
    
    inline double operator*(Point3D& point1,Point3D& point2)
    {
        Point3D point(point1);
        point.xcomp *= point2.xcomp;
        point.ycomp *= point2.ycomp;
        point.zcomp *= point2.zcomp;
        return point.xcomp + point.ycomp + point.zcomp;
    }
    

    Ich habe die Objekte const gesetzt, bei denen es zweckmäßig ist und der Compiler auch keine Fehlermeldung liefert. Dabei ist mir nicht klar, warum ich die übergebenen Objekte point1 und point2 bei der Operatorfunktion * nicht const deklarieren kann, bei der Operatorfunktion + hingegen schon. Konstante Objekte erlaufen ja nur einen lesenden Zugriff auf die privaten Elemente mit Memberfunktion die auch const ist. Wird mit point += point2; in der + Operatorfunktion
    nicht genauso lesend auf die Daten zugegriffen wie bei der Operatorfunktion *? Vielen Dank!


  • Mod

    Da sind zwar viele andere Fehler drin (liest du Compilerwarnungen?), aber dass man in Zeile 40 nicht auch

    inline double operator*(const Point3D& point1,const Point3D& point2)
    

    schreiben könnte, stimmt einfach nicht. Kann man, und ist auch besser so. Ändert natürlich nichts an den anderen Fehlern und Warnungen, die dieser Code schmeißt. Musst natürlich auch Zeile 20 mitziehen.

    Da das praktisch bei jedem deiner Threads vorkommt, zum letzten Mal: Wie man Probleme nachvollziehbar macht. Lesen! Verstehen! Anwenden!



  • Vielen Dank für deine schnelle Antwort.
    Was ich an meinen Post hätte anders machen ist mir nicht klar. Ich habe das Problem & meine Frage denke ich klar und präzise ausgedrückt und den relevanten Quellcode dazu online gestellt. Die angelegten Operatorenfunktionen auch noch
    zu erklären, würde denke ich den erforderlichen/nötigen Rahmen sprengen


  • Mod

    Das ist nicht der Quellcode zu deiner Frage. Der gezeigte Quellcode ist nicht compilierbar, aber aus anderen Gründen als deine Frage. Deine Frage hingegen kann man mit dem Code nicht nachvollziehen, denn wenn man da const hinschreibt, dann kommen genau die gleichen Fehler wie vorher (die ganz woanders sind), und keine Fehler zu dem const. Folgerung: Das ist nicht der Code zu der Frage.



  • @C-Sepp
    Naja du hättest z.B. die Fehlermeldung posten können.
    Ich vermute mal dass da drin stand dass der operator nicht auf private Member zugreifen darf. Weil du vermutlich das const in der friend Zeile vergessen hast.



  • Ich habe in meine Klasse Point3D, zur Darstellung von Punkten im dreidimensionalen Raum, jetzt eine Operatorfunktion, welche den <<-Operator überladt, mit reingenommen.

    class
    {
    ...Konstruktor, verschiedene Operatorfunktionen
    ...
       friend ostream& operator<<(ostream& os, const Point3D& point) {
            os << point.toString();
            return os;
        }
    

    Diese Operatorfunktion musste ich als "Freund" deklarieren, da mir sonst der Compiler die Fehlermeldung:
    "error C2804: Binärer Operator "<<" hat zu viele Parameter" geliefert hätte.
    Eigentlich dachte, das die Deklaration als "friend" lediglich den direkten Zugriff auf die privaten Member ermöglicht.
    Warum sind damit auch klasseninterne Operatorfunktion mit mehreren Übergabeparametern möglich? Ist das einfach so
    oder gibt es noch eine genauere Begründung dafür? Vielen Dank!



  • Wenn du sie innerhalb der Klasse ohne friend deklarierst (bzw. definierst), dann definierst du damit den für diese Klasse geltenden Operator (und dieser darf eben nur genau einen Parameter haben - der linke Parameter ist ja das Klassenobjekt selbst).
    Bei einer als friend deklarierten Funktion (auch innerhalb einer Klasse) ist aber immer eine freie Funktion gemeint (du willst ja den ostream& Operator << überladen, nicht den für die Klasse).

    Und durch sowohl die Verwendung von friend als auch gleichzeitige Definition der Funktion innerhalb einer Klasse(ndefinition) erspart man sich die doppelte Arbeit, nämlich nur Deklaration der Funktion als friend innerhalb der Klasse und die eigentliche Definition dann außerhalb als freie Funktion.

    Besser wäre jedoch du benötigst gar keine friend Angabe und definierst diese Funktion gleich außerhalb der Klasse und greifst nur auf öffentliche (public) Member zu.


Anmelden zum Antworten