Complex: Operator - Überladung für *


  • Mod

    KasF schrieb:

    Hi,

    ja das musste 🙂

    const COMPLEX operator*(const COMPLEX& a, const COMPLEX& b)
    {
        return Complex(){ a.real*b.real, a.img*b.img };
    }
    

    😮

    Ganz nebenbei enthält die Standardbibliothek bereits eine Klasse complex mit geeigneten Überladungen für mathematische Funktionen einschließlich Operatoren.



  • KasF schrieb:

    const COMPLEX operator*(const COMPLEX& a, const COMPLEX& b)
    {
        return Complex(){ a.real*b.real, a.img*b.img };
    }
    
    const COMPLEX operator*(const COMPLEX& a, const COMPLEX& b)
    {
        Complex c;
        c.real=a.real*b.real-a.img*b.img;
        c.img=a.img*b.real+a.real*b.img;
        return c;
    }
    

    edit: Oh, war jan struct 😃



  • Oder alternativ 'complex' aus der std nehmen. Liegt soweit ich mich erinnere in 'process' könnt mich aber auch irren.

    Ich fand es auf jedenfall ganz praktisch als ich die Mandelbrotmenge (ala Apfelmänchen) "erforscht" habe. Zuerst hab ich auch alles selber geschreiben aber als ich fast fertig war mit dem Complex-Typ hab ich ihn endeckt, typisch.
    Nunja, finde er spart einiges an Zeit und ist als Template implementiert was auch schnell einen umstieg auf float zulässt um die Performance ein wenig zu steigern (macht eh kaum unterschiede wenn man das Apfelmänchen auf dem Bildschirm zaubert)

    Gruß
    Baracke

    PS: camper war schneller



  • danke euch

    Hmm....
    wohin gehört das denn? In die structure rein oder in die Template Klasse?

    Ich kriege beide male folgenden Fehler:

    Fehler: »const COMPLEX Class<T>::operator*(const COMPLEX&, const COMPLEX&) [with T = double]« muss entweder null oder ein Argument nehmen
    

    ich weiß dass es einen comlex typ gibt aber ich habe es bewusst selber gemacht 🙂



  • camper schrieb:

    😮

    Bezieht sich das auf die falsche mathematische Multiplikation 🙂 oder darauf das ich versucht habe, diese Schreibweise:

    COMPLEX aa = { 5, 5 };
    

    irgendwie als return hinzubekommen ? ( Ein struct mit C'tor wäre schöner dafür )



  • Mati schrieb:

    wohin gehört das denn? In die structure rein oder in die Template Klasse?

    In keins von beiden :), sollte global sein ...



  • 😮
    Was echt? Bin überrascht....also global über einer Klasse wie z.B ein struct?



  • Ja im Endeffekt ist es eine Funktion die von operator* aufgerufen wird und wenn du diese Funktion überall benutzen willst, was üblich für op* sein sollte, dann muss sie halt global irgendwo stehen, wo der Compiler sie finden kann.



  • argh....jetzt kriege ich multiple definitions of operator *...

    kann es sein wenn ich einen Pointer auf einen COMPLEX typ anlege dieser mit der multiplikation durcheinanderkommmt?

    also sowas?

    COMPLEX* a = ....
    

    was tun?



  • Mati schrieb:

    argh....jetzt kriege ich multiple definitions of operator *...

    Vermutlich ODR verletzt - zieh die Implementierungen aus den Headern heraus oder mach sie inline (ist aber kein operator-Problem).

    kann es sein wenn ich einen Pointer auf einen COMPLEX typ anlege dieser mit der multiplikation durcheinanderkommmt?

    Nein.



  • Mati schrieb:

    was tun?

    Kein "unnötigen" Pointer benutzen 😉
    Und zeig mal bitte, wie dein Code momentan aussieht.



  • Jap, inline wars....jetzt muss ich nur noch rausfinden warum....?

    Die pointer sind leider Notwendig...und der code würde so wie er vorliegt wohl den rahmen sprengen...

    in der main (wo der compiler mit multiple schreit) steht im grunde nur:

    Matrix<COMPLEX> *A_COMPLEX = NULL;

    ...also ich weiß net...aber mit inline gehts...



  • Mati schrieb:

    Jap, inline wars....jetzt muss ich nur noch rausfinden warum....?

    Weil sie, wenn sie im Header stehen, mehrfach definiert werden. Mit inline sagst du, diese Definitionen sind gleich.


Anmelden zum Antworten