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: 0xbfae3368Erwartet 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&« umgeformtWas 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& [...]