bool ändert sich komischerweise bei Loki::StaticDispatcher



  • Ich verstehe einfache nicht, warum sich der bool wieder ändert, obwohl ich ihn nirgends auf false setzte:

    #include <iostream>
    #include <loki/MultiMethods.h>
    
    struct Base
    {
        virtual ~Base() {}
    };
    
    struct Widget : public Base
    {
        Widget(int x = 0) : x_(x) {}
        int x_;
    };
    
    class HatchingExecutor
    {
    public:
        void Fire(Widget& lhs, Widget& rhs)
        {
            if(lhs.x_ == rhs.x_)
            {
                bool_ = true;
            }
            std::cout << "Bool: " << bool_ << " Adresse: " << &bool_ << std::endl;
        }
        void OnError(Base&, Base&) {}
        HatchingExecutor() : bool_(false) { std::cout << "Konstruktor" << std::endl; }
    private:
        bool bool_;
    };
    
    int main()
    {
        HatchingExecutor exec;
        typedef Loki::StaticDispatcher<HatchingExecutor, Base, LOKI_TYPELIST_1(Widget)> Dispatch;
    
        Widget a;
        Widget b(1);
        Widget c;
    
        Dispatch::Go(a, c, exec);
        Dispatch::Go(a, b, exec);
        Dispatch::Go(c, b, exec);
    }
    

    Ausgabe:

    Konstruktor
    Bool: 1 Adresse: 0xbfae3368
    Bool: 0 Adresse: 0xbfae3368
    Bool: 0 Adresse: 0xbfae3368
    

    Erwartet habe ich, dass der bool immer bei 1 bleibt, da ich ihn beim ersten Dispatch::Go ja auf true setzte. Wo wird er wieder auf false gesetzt??!?

    mfg.



  • Hallo,

    Kann es sein, dass du in dieser Zeile eine Variable erstellst, die auf false ist und mit der du dann weiterarbeitest?

    HatchingExecutor() : bool_(false) { std::cout << "Konstruktor" << std::endl; }

    Kann mich aber auch irren.

    MFG winexec*



  • winexec* schrieb:

    Hallo,

    Kann es sein, dass du in dieser Zeile eine Variable erstellst, die auf false ist und mit der du dann weiterarbeitest?

    HatchingExecutor() : bool_(false) { std::cout << "Konstruktor" << std::endl; }

    Das hab ich mir auch schon gedachte, aber der Konstruktor wird ja nur einmal aufgerufen und hier setze ich sie auf true:

    if(lhs.x_ == rhs.x_)
            {
                bool_ = true;
            }
            std::cout << "Bool: " << bool_ << " Adresse: " << &bool_ << std::endl;
    

    Sonst gibt es einfach keinen Punkt wo ich sie auf false setze. Es ist zum heulen 😞

    mfg.



  • Hallo,

    Guck noch einmal, ob das wirklich durchlaufen wird. Aber ansonsten wüsste ich nicht vom vorgegebenen Code her, wo der Fehler liegt.

    MFG winexec*



  • winexec* schrieb:

    Hallo,

    Guck noch einmal, ob das wirklich durchlaufen wird.

    Sonst würde er ja nicht Bool: 1 ausgeben, oder?

    mfg.



  • vielleicht liegt es ja daran, dass bei

    Dispatch::Go(a, c, exec);
    

    eine kopie von exec übergeben wird...



  • ... schrieb:

    vielleicht liegt es ja daran, dass bei

    Dispatch::Go(a, c, exec);
    

    eine kopie von exec übergeben wird...

    Aber dann würde doch "Konstruktor" nochmal ausgegeben?

    edit: Scheiße, da wird ja dann der Kopierkonstruktor aufgerufen, mein Fehler. Okay daran liegt's, wie lässt sich das umgehen, die Go Funktion ist ja nicht meine...

    mfg.



  • nicht wenn der copy-ctor ausgeführt wird



  • ... schrieb:

    nicht wenn der copy-ctor ausgeführt wird

    ist mir auch gerade eingefallen (siehe edit)



  • keine ahnung, kenn mich mit loki nicht aus. kannst ja mal

    typedef Loki::StaticDispatcher<HatchingExecutor&, Base, LOKI_TYPELIST_1(Widget)> Dispatch;
    

    probieren.



  • ... schrieb:

    keine ahnung, kenn mich mit loki nicht aus. kannst ja mal

    typedef Loki::StaticDispatcher<HatchingExecutor&, Base, LOKI_TYPELIST_1(Widget)> Dispatch;
    

    probieren.

    Auch gerade gedacht, nur: Intern verwendet die Lib ne Referenz und ich erhalte dann:

    /usr/include/loki/MultiMethods.h:45: Fehler: reference wird in Referenztyp »HatchingExecutor&« umgeformt
    

    Was ist der Sinn eigentlich, dass der Executor bei jedem Dispatch kopiert wird?? Was haben sich die Programmierer dabei gedacht??!?

    mfg.



  • eigentlich müsste go einen executor& nehmen. denn laut dem pdf hier heißt es

    StaticDispatcher implements the Go member function, which takes a BaseLhs&, a BaseRhs&, and an Executor& [...]


Anmelden zum Antworten