Teilweise Initialisierungsliste möglich?



  • Hatte ich eh so verstanden. Ich wollte nur nochmal bekräftigen dass ich es auch für eine wirklich schlechte Idee halt.
    BTW: Danke für den Link. Ich hatte es nicht nachgesehen sondern nur ausprobiert, daher "anscheinend" 🙂



  • This post is deleted!


  • @hustbaer sagte in Teilweise Initialisierungsliste möglich?:

    @alfons19 Ich finde es ehrlich gesagt erschreckend dass es (anscheinend?) erlaubt ist eine nicht-statische Memberfunktion in der Initialisierungsliste zu verwenden. Verwende lieber eine freie Funktion der du den Real- und Imaginärteil als Parameter mitgibst.

    Was spricht denn dagegen? Ich habs jetzt mal so geändert:

    ComplexCalc::ComplexCalc(double re, double im)
        :m_re(re),
         m_im(im),
         m_magnitude(sqrt((re * re) + (im * im)))
    {
        computeAngle();
    }
    

    Wobei computeAngle() eine private Memberfunktion ist.

    void ComplexCalc::computeAngle()
    {
        if(m_re == 0 && m_im == 0) m_angle = 0;
        else if(m_re == 0 && m_im > 0) m_angle = 90;
        else if(m_re == 0 && m_im < 0) m_angle = -90;
        else if(m_re > 0 && m_im == 0) m_angle = 0;
        else if(m_re < 0 && m_im == 0) m_angle = 180;
        else
        {
            m_angle = (180 / M_PI) * atan(m_im / m_re);
            if(m_re < 0 && (m_im > 0 || m_im < 0)) m_angle += 180;
            else if(m_re > 0 && m_im < 0) m_angle += 360;
        }
    }
    


  • @alfons19 Weil irgendwann irgendein Irrer von ComplexCalc erbt und du dann eventuell in der Kacke sitzt. Ich mag jetzt nicht näher darüber nachdenken. Tu's nicht.



  • @Swordfish "Tu's nicht" kann man ja gerne vertreten, aber ich sehe beim besten Willen nicht, wie da irgendein Irrer Alfons in die Kacke setzen sollte.
    Ich lehne mich mal weit aus dem Fenster und behaupte: das macht 0 Unterschied, ob in dem Beispiel computeAngle frei oder member ist (bzgl. "gefährlich").



  • Der irre Alfons ist nicht das Problem.

    Das Problem ist dass du dann eine Memberfunktion hast, in der du auf bestimmte Member nicht zugreifen kannst ohne dadurch "undefined behavior" zu bekommen. Weil sie nämlich noch nicht konstruiert wurden. Um zu verstehen dass und warum das alles OK ist so wie es dasteht muss man viel zu viel wissen und sich über viel zu viele Dinge Gedanken machen.

    Die Zeit & Hirnzellen kann man sinnvoller nutzen.

    ps: Natürlich ist sowas auch "gefährlich". In diesem einfachen Beispiel vielleicht nicht so sehr. Aber im Allgemeinen schon. Denn wenn jemand Änderungen an der Klasse macht der sich nicht darüber im Klaren ist dass bestimmte Funktionen in der Initializerliste auf halb konstruierte Objekte aufgerufen werden und/oder was das bedeutet... dann kann dabei schnell UB rauskommen. Und nicht nur formales UB sondern ganz reales UB.



  • @alfons19 sagte in Teilweise Initialisierungsliste möglich?:

    Was spricht denn dagegen?

    Ein anderer wirklich dagegen sprechende Grund ist, dass du nun für jede komplexe Zahl, ob du willst oder nicht, Betrag und Phasenwinkel berechnest. Insbesondere sind sqrt und atan nicht unbedingt schnelle Operationen. Daher ist es oft sinnvoll, diese nicht schon "auf Verdacht" zu berechnen.

    Noch ein anderer Grund ist Testbarkeit: freie Funktionen lassen sich sehr einfach testen. Memberfunktionen nicht so leicht. Du kannst dein computeAngle nicht separat testen, sondern nur im Zusammenhang über eine ComplexCalc-Variable. Dabei hängt es nur von 2 doubles ab und nicht von m_magnitude. Du berechnest zwangsweise jedes mal m_magnitude mit, wenn du nur computeAngle willst. Wenn du dagegen aus computeAngle eine Funktion machst, die re und im als Parameter bekommt und einen double liefert, wird es schon viel klarer, was die Funktion tut und von welchen Inputs sie abhängt. Es ist oft hilfreich, exakt zu wissen, welche Werte in eine Funktion eingehen.

    Auf jeden Fall sollte computeAngle nicht die Membervariable ändern. Expliziter ist es, den Wert einfach zu returnen.



  • Hallo hustbaer
    @hustbaer sagte in Teilweise Initialisierungsliste möglich?:

    dass bestimmte Funktionen in der Initializerliste

    Ich bezog mich auf das Beispiel und da wird in der Initializerliste keine Memberfunktion aufgerufen.
    Wie gesagt, nichts gegen das "tu's nicht", aber dann bitte richtig begründen (im Ctor-body ist alles initialisiert, da macht auch der irre Alfons nichts dran).

    @alfons19 Ich hoffe es ist klar, dass der "irre Alfons" nichts mit dir zu tun hat!



  • @Jockelx Du guckst nicht richtig. Das Beispiel auf das das "tu's nicht" bezogen war ruft natürlich eine Memberfunktion in der Initializerliste auf. Hier:

    @alfons19 sagte in Teilweise Initialisierungsliste möglich?:

    So in etwa?

    ComplexCalc::ComplexCalc(double re, double im)
        :m_re(re),
         m_im(im),
         m_magnitude(sqrt((re * re) + (im * im))),
         m_angle(computeAngle()) // <-------- Se cräzÿ call to se cräzÿ memberfünction
    {
    }


  • This post is deleted!

Log in to reply