friend funtkionen



  • Es geht um die Operatorüberladung und die damit verbundene Verwendung des Wortes friend. Wenn ich einen Operator überlade bepielsweise so:

    complex operator+(double);
    

    und natürlich eine geeignete Definition vornehme kann ich später

    complex::objekt1 + 10.00 schreiben.

    Ich kann aber nicht 10.00+ complex::objekt1 schreiben. Gut das steht auch in meinem Buch. Da wrid als Lösung folgendes geschrieben.

    friend complex operator+(double, complex&);
    

    soll innerhalb der Klassendeklaration geschrieben werden. Löst sich obiges Problem schon allein durch diese Deklaration oder muss dazu noch eine geeignete Definiton geschrieben werden und wenn ja wie würde diese aussehen???



  • Du musst auch noch die Funktion definieren:

    const complex operator+(const double d,const complex& c)
    {
        //...
    };
    

    cont complex als Rückgabewert, weil du sonst

    comblex c;
    (15+c)=another_complex;
    

    schreiben kannst. const double, um konstanten übergeben zu können (muss man das überhaupt schreiben? ne oder?). const complex& um nicht zu kopieren und konstanten übergeben zu können.



  • ness schrieb:

    const double, um konstanten übergeben zu können (muss man das überhaupt schreiben? ne oder?)

    Ne. Da du den double bei value übergibst ist das const hier völlig unnötig (der Wert wird kopiert und ist damit nach außen hin unveränderbar). Es ist äquivalent zu

    const complex operator+(double d,const complex& c)
    


  • habe nun eine Operatorfunktion mit zwei parametern. Bei der Version Objekt+primitiv ist die Anwendung klar. Objekt+Primitiv wobei das gleich ist mit Objekt.+(primitiv). Nur wie ist das mit zwei Pametern?

    primitv.//geht nicht ist ja kein Objekt

    primitiv+Objekt. nur wo ist der zweite Parameter? Und wie ist es möglich daß dann die Funktion aufgerufen wird. Ich wende ja eine Operation auf den primitiven Typen an. Werden dann automatisch beide Operanden als Parameter angenommen? Einen Operator für primitive typen kann man nicht überladen soweit ich weiß.

    Thx



  • Lazarus schrieb:

    habe nun eine Operatorfunktion mit zwei parametern. Bei der Version Objekt+primitiv ist die Anwendung klar. Objekt+Primitiv wobei das gleich ist mit Objekt.+(primitiv). Nur wie ist das mit zwei Pametern?

    Dort wird einfach die globale Funktion operator + (primitiv, const complex&) aufgerufen.



  • Prinzipiell kannst du auch 2 Operator Funktionen schreiben:
    operator + (primitiv, const complex&)
    operator + (const complex&, primitiv)

    das kommt aufs selbe. Nur zur Ergaenzung und zum evtl. besseren Verstaendnis, so wurde mir das auch schnell klar 😉

    Btw. würde ich den Double auch per Referenz übergenen, dann macht auch das const wieder Sinn.

    Gruss,
    DeSoVoDaMu



  • Mein Verständnisproblem ist folgendes. Wie kann man eine globale Funktion innerhalb der Klassendeklaration vornehmen. Statisch, o.k, gibts aber was soll global in einer Klasse bedeuten?.

    Das mit const und referenzen usw. das kapier ich mittlerweile das ist nicht mein Problem. Mein Problem sind die beiden Funktonsparameter. ich schreib ja ganz normal im Quelltext double+Objket. Wírd nun automatisch aufgrund des Vorkommens dieses Codestücks die Funktion aufgerufen und die parameter erkannt und eingefügt? Ich schreibe ja nicht im Quelltext double+Objekt(double,Objekt&).
    Wobei ich nun wieder bei dem Problem global bin. Global ist mür mich eine Funktion die außerhalb der Klassendeklaration steht?

    und wie sieht dann eine beispielhafte implementierung aus?.

    Dort wird einfach die globale Funktion operator + (primitiv, const complex&)
    


  • Lazarus schrieb:

    ich schreib ja ganz normal im Quelltext double+Objket. Wírd nun automatisch aufgrund des Vorkommens dieses Codestücks die Funktion aufgerufen und die parameter erkannt und eingefügt?

    Eingefügt wird sie sowieso nur, wenn sie als inline deklariert ist.
    Wenn im Quelltext

    complex Compl = 4;
    complex = 1.75 + complex;
    

    oder etwas vergleichbares vorkommt, dann sucht der Compiler nach einer Operator Funktion zum addieren, welche als linken Operanden ein Double und als rechten Operanden ein complex Objekt erwartet.
    Die muss quasi global sein, da double keine Klasse ist sondern ein Standard Datentyp. Du kannst also nicht in der Implementation von double eine solche Operatorfunktion reinschreiben.

    Lazarus schrieb:

    Wobei ich nun wieder bei dem Problem global bin. Global ist mür mich eine Funktion die außerhalb der Klassendeklaration steht?

    Das ist richtig. Du verbindest diese Funktion ja auch nicht mit der Klasse.
    Es ist einfach eine solche Funktion:

    const complex operator + (const double& d, const complex& c)
    {...}
    

    zum Vergleich eine zur Klasse gehoerende Funktion saehe ja so aus:
    [cpp] const complex **complex::**operator + (const double& d)
    {...}[/cpp]
    Als friend deklarierst du sie in der Klasse, falls diese globale Funktion auf protected/private Member deiner Klasse zugreifen will, was ihr damit explizit erlaubt wird.



  • Suppi, danke für die Erklärung jetzt hats klick gemacht.

    Tschuu


Anmelden zum Antworten