c++ 11 Event implementation



  • @SeppJ sagte in c++ 11 Event implementation:

    Bitte nicht wild herum raten!

    Nun ja ich kann jetzt abwarten bis mir jemand eine fertige Lösung präsentiert oder selber mit dazu beitragen eine Lösung zu finden. Da ich die Lösung aber nicht kenne, kann ich ja nur testen.

    @SeppJ sagte in c++ 11 Event implementation:

    Dein Problem ist, dass du nach wie vor nicht weißt, was du in deinen Eventhandler packen möchtest, oder umgekehrt, welche Art von Events dein Eventhandler handlen soll.

    Na doch weiß ich dass.
    Der jenige der das Event auslöst übergibt ja den parameter vom typ String

    Die Auslösung des Events fehlt noch im oberen Beispiel.

    class SomeClass
    {
     public:
           Event<std::string> SomethingChanged;
    
        void SayHello()
       { 
          SomethingChanged("Hello");
       }
    
    }
    

    Wird SayHello aufgerufen wird das Event ausgelöst und der string "Hello" übergeben.

    In der Verwendung meines Lambda ausdruck kann ich ja sehen dass es funktioniert:
    Und ergänze das ganze noch der vollständigkeit um einen Membervariable.

    std::string _name = "Welt";
    
    
    _someClass.SomethingChanged += [this](std::string message) {std::cout << message << " " << _name <<   endl; }
    


  • OK, habe es noch mal ausprobiert: Ideone-Code

    _someClass.SomethingChanged  += std::bind(&Onemoreclass::Print, *this, std::placeholders::_1);
    

    (beachte die Dereferenzierung bei *this)



  • @Th69

    Hallo Th69

    Hast du das kompiliert? Also bei mir kommt ne Fehlermeldung:

    Error C2661: 'std::tuple<Onemoreclass,std::_Ph<1>>::tuple': no overloaded function takes 2 arguments (1)



  • Ja! Hast du den Link nicht angeklickt?

    Welchen Compiler nutzt du denn (das man solche Infos immer explizit nachfragen muß...)?



  • @Th69 sagte in c++ 11 Event implementation:

    das man solche Infos immer explizit nachfragen muß..

    (dass man hier immer solche schnippischen Kommentare erhält)

    IDE: Visual Studio 2017
    Plattform Toolset: v141_xp
    Language: ISO C++17 Standard (/std:c++17)



  • Und eigentlich ging es mir ja da drum dass ich das Event wieder aushängen kann.

    _someClass.SomethingChanged  -= ??
    


  • Wenn beides innerhalb einer Funktion passiert (also quasi temporär), dann sollte es auch so funktionieren:

    auto f = [](std::string message) {std::cout << message << endl; };
    _someClass.SomethingChanged += f;
    // do something ...
    _someClass.SomethingChanged -= f;
    

    Ansonsten poste mal 1:1 die ganze Fehlermeldung vom VS bzgl. meines Codes.



  • Das Problem ist, dass std::function keinen Vergleichsoperator anbietet, bzw. beim Gleichheitsoperator nur prüft, ob der interner Zeiger (oder was auch immer) gültig ist.
    Wenn du wirklich auf Gleichheit prüfen möchtest muss du das Objekt und die aufzurufende Funktion mitführen, um hinterher zwei Callbacks vergleichen zu können. Das geht bei Lambdas allerdings schon nicht mehr, und da ist jetzt die Frage, ob man das jetzt wirklich alles selbst programmieren möchte oder vielleicht nicht doch lieber boost::signals2 benutzt.



  • @Th69 sagte in c++ 11 Event implementation:

    Wenn beides innerhalb einer Funktion passiert (also quasi temporär), dann sollte es auch so funktionieren

    ja das tut es ja eben leider nicht.

    @Th69 sagte in c++ 11 Event implementation:

    Ansonsten poste mal 1:1 die ganze Fehlermeldung vom VS bzgl. meines Codes.

    Hmm. Jetzt stehe ich vor nem anderen Problem. Habe bisher nur in meinem richtigen Projekt getestet.
    Da kommt die Fehlermeldung.

    Für den Test habe ich mir nun ein neues Projekt gemacht. Und deinen Code rein kopiert. Da kommt keine Fehlermeldung.
    Keine Ahnung was an dem Testprojekt anders ist.

    @DocShoe sagte in c++ 11 Event implementation:

    Das geht bei Lambdas allerdings schon nicht mehr, und da ist jetzt die Frage, ob man das jetzt wirklich alles selbst programmieren möchte oder vielleicht nicht doch lieber boost::signals2 benutzt.

    Ok hatte halt eine einfache Implementation für Events gesucht. Sollte doch vieleicht lieber was bewertes verwenden.
    Danke für den Tipp.



  • bekomme genau die selbe Fehlermeldung auch wenn ich signals2 verwende:

    Hier mal die ganze Fehlermeldung aus dem Output:

    communication::CommunicationManager entspricht hier der OnemoreClass

    xutility(332): error C2661: 'std::tuple<communication::CommunicationManager,std::_Ph<1>>::tuple': no overloaded function takes 2 arguments
    functional(1896): note: see reference to function template instantiation 'std::_Compressed_pair<void (__thiscall communication::CommunicationManager::* )(std::string),std::tuple<communication::CommunicationManager,std::_Ph<1>>,false>::_Compressed_pair<_Ty,communication::CommunicationManager&,const std::_Ph<1>&>(std::_One_then_variadic_args_t,_Other1 &&,communication::CommunicationManager &,const std::_Ph<1> &)' being compiled
            with
            [
                _Ty=void (__thiscall communication::CommunicationManager::* )(std::string),
                _Other1=void (__thiscall communication::CommunicationManager::* )(std::string)
            ]
    \functional(1897): note: see reference to function template instantiation 'std::_Compressed_pair<void (__thiscall communication::CommunicationManager::* )(std::string),std::tuple<communication::CommunicationManager,std::_Ph<1>>,false>::_Compressed_pair<_Ty,communication::CommunicationManager&,const std::_Ph<1>&>(std::_One_then_variadic_args_t,_Other1 &&,communication::CommunicationManager &,const std::_Ph<1> &)' being compiled
            with
            [
                _Ty=void (__thiscall communication::CommunicationManager::* )(std::string),
                _Other1=void (__thiscall communication::CommunicationManager::* )(std::string)
            ]
    functional(1896): note: while compiling class template member function 'std::_Binder<std::_Unforced,void (__thiscall communication::CommunicationManager::* )(std::string),communication::CommunicationManager &,const std::_Ph<1> &>::_Binder(_Fx &&,communication::CommunicationManager &,const std::_Ph<1> &)'
            with
            [
                _Fx=void (__thiscall communication::CommunicationManager::* )(std::string)
            ]
    functional(1923): note: see reference to function template instantiation 'std::_Binder<std::_Unforced,void (__thiscall communication::CommunicationManager::* )(std::string),communication::CommunicationManager &,const std::_Ph<1> &>::_Binder(_Fx &&,communication::CommunicationManager &,const std::_Ph<1> &)' being compiled
            with
            [
                _Fx=void (__thiscall communication::CommunicationManager::* )(std::string)
            ]
    \communicationmanager.cpp(188): note: see reference to class template instantiation 'std::_Binder<std::_Unforced,void (__thiscall communication::CommunicationManager::* )(std::string),communication::CommunicationManager &,const std::_Ph<1> &>' being compiled
    


  • Quelltext wäre spannend...



  • @DocShoe

    Ja ich weiß aber das ist das Problem. Der ist viel zu groß und darf ich auch nicht so raus geben. Drum habe ich ja das Beispiel gemacht. Blöd dass hier der Fehler nicht auftaucht.

    Irgendwas muss anders sein.





  • Ja danke swordfish

    Klar wenn ich ein Beispielprojekt erstellen könnte wo der Fehler auftaucht. Wüßte ich ja auch wo mein Fehler ist.
    Dann bräuchte ich keine Hilfe.



  • Was soll man auf soetwas sagen? Bemüh Dich??



  • Oh man...
    Vielleicht kann mir auch jemand helfen? @booster ?

    Ich habe das Programm

    #include <iostream>
    int main()
    {
      std::cout << "Hallo";
      return 0;
    }
    

    Das funktioniert super. Jetzt habe ich hier aber ein Programm, was irgendwie anders ist und da funktioniert es nicht!
    Den Code darf ich leider nicht zeigen. Kann mir jemand bitte helfen?



  • @booster sagte in c++ 11 Event implementation:

    Ja ich weiß aber das ist das Problem. Der ist viel zu groß und darf ich auch nicht so raus geben. Drum habe ich ja das Beispiel gemacht. Blöd dass hier der Fehler nicht auftaucht.

    Irgendwas muss anders sein.

    Besorgt euch nen Consultant und lasst den ein NDA unterschreiben. Vllt kann der euch weiterhelfen.



  • Hallo Leute alles gut. Ist mir schon klar dass ihr mir nicht helfen könnt wenn ihr keinen Quelltext habt. Habe ich ja gar nicht gefordert. Habe lediglich meinen Unmut geäußert dass in meinem Beispiel der Fehler nicht auftaucht.



  • @booster sagte in c++ 11 Event implementation:

    Hallo Leute alles gut. Ist mir schon klar dass ihr mir nicht helfen könnt wenn ihr keinen Quelltext habt. Habe ich ja gar nicht gefordert. Habe lediglich meinen Unmut geäußert dass in meinem Beispiel der Fehler nicht auftaucht.

    Hast du mal versucht, deinen Originalcode zu nehmen, die relevanten Teile rauszuschneiden und die Reste soweit zu reduzieren, solange der Fehler noch da ist? Funktionen und Objekte kann man ja dann zur Veröffentlichung auch umbenennen, um die tatsächliche Funktionalität zu verschleiern. Das ist natürlich für dich etwas Aufwand, aber wenn du der Sache auf die Spur kommen willst, wird dir vermutlich nicht viel anderes übrig bleiben.



  • Da es in einem frischen Projekt nicht auftritt verlgeich doch mal die compiler Einstellungen. Eventuell sind diese Unterschiedlich und dadurch wird das Problem im eigendlichen Projekt ausgelöst


Anmelden zum Antworten