Designfrage



  • Abend Leute!

    Ich bräuchte eure Hilfe.
    Was ich vorhabe: Ich schreibe eine Bibliothek die dann gewrapped wird um die Funktionalität in eine GUI darzustellen.

    Mein Problem:
    Ich habe eine Klasse "AnObject" die intern eine Connection verwaltet, die asynchron auf Nachrichten wartet.
    Die Klasse "AnObject" wartet auf "Daten" der Connection.
    Die "Daten" müssen in der Funktion "receive" geparsed werden und dann soll das entsprechende Event aufgerufen werden.

    Aber wie?
    Ich dachte an einer EventHandler-Klasse aber ich habe keine Ahnung wie ich das lösen könnte...
    Die EventHandler Klasse sollte vom Programmierer der die Bibliothek benutzt, so verändert werden können, dass er sich mit dem Event verbindet (Signal) und dadurch weiß: Jetzt ist wurde das Event X aufgerufen, welches für XYZ zuständig ist.

    Lösungen, die die Boost-Bibliothek benötigen sind auch willkommen! 🙂

    class AnObject {
        Connection connection_;
    };
    
    class Connection {
    private:
        void receive() {
            /*
                hier sollte die empfangene Nachricht geparsed werden und das gegebene Event aufgerufen werden.
            */
    };
    

    Ich hoffe dass ich das Problem gut schildern konnte. Wenn nicht bitte ich euch um Rückmeldung! 😞



  • hilfe hilfe schrieb:

    Lösungen, die die Boost-Bibliothek benötigen sind auch willkommen! 🙂

    Ich denke dann ist boost.signal genau das was du suchst 😉



  • dot schrieb:

    hilfe hilfe schrieb:

    Lösungen, die die Boost-Bibliothek benötigen sind auch willkommen! 🙂

    Ich denke dann ist boost.signal genau das was du suchst 😉

    Jap! Genau! 🙂
    Aber wie könnte man die Lösung am besten implementieren?
    Mir geht es hauptsächlich ums Design bzw. einer schönen Lösung. Boost.Signal ist gut, aber wohin damit?



  • Na wie wärs mit sowas:

    class Connection
    {
    private:
    
    public:
    
      boost::signal<void (const Message&)> MessageReceived;
    
    };
    

    Jetzt kann jeder der will ein Callback an das MessageReceived signal von deiner Connection hängen und wird benachrichtigt wenn eine Nachricht heringekommen ist...



  • Hey dot!
    Danke für deine Antwort.
    Sollte man "MessageReceived" noch kapseln oder ist das Gang und Gäbe, dass man solche Signale public macht?



  • hilfe hilfe schrieb:

    Sollte man "MessageReceived" noch kapseln oder ist das Gang und Gäbe, dass man solche Signale public macht?

    Kapseln, wegen Thread-Safety.



  • eine sekunde zu früh gepostet...


Anmelden zum Antworten