<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Kann man hier irgendwie die codewiederholungen rausbekommen?]]></title><description><![CDATA[<p>Ich bin grad dabei, eine kleine GUI zu schreiben, und bin dabei auf folgendes Problem gestoßen:</p>
<p>Für meine Nachrichten verteilung hab ich mich für einen VCL ähnlichen ansatz entschieden, ich hab also nicht für die fenster einen großen callback, sondern viele kleinere. Diese unterscheiden sich natürlich darin, welche parameter sie übergeben bekommen, etc und im endeffekt sieht meine Klasse nun(gekürzt) so aus:</p>
<pre><code class="language-cpp">class Object{
        private:
            Observer observer;
            //...
        protected:
            //diese funktionen werden von den abgeleiteten Objekten überschrieben,
            //die das event gesondert verarbeiten müssen
            virtual void ownSetTime(std::time_t time);

            virtual void ownMouseKlick(Button button,int x,int y);
            virtual void ownEnterKey(KeyState state,int key);
            virtual void ownWheelMove(int degree);
            //...

        public:

            //öffentliche schnittstelle
            void setTime(std::time_t time);

            void mouseKlick(Button button,int x,int y);
            void enterKey(KeyState state,int key);
            void wheelMove(int degree);
            //...
    };

    void Object::mouseKlick(Button button,int x,int y)
    {
        ownMouseKlick(button,x,y);

        //benachrichtigen der observer
        observer.mouseKlick(button,x,y,this);
    }
    //...

    class Observer{
        private:
            std::vector&lt;std::tr1::function&lt;void(Button,int,int,Object*)&gt; &gt; mouseKlick;
            //...
        public:
            void mouseKlick(Button button,int x,int y,Object* object);
            //...
    };
</code></pre>
<p>Das Problem ist nun natürlich, dass es unglaublich schwer ist, hier mal ein neues event einzuführen, da ich an vielen stellen rumfummeln müsste.</p>
<p>Hat da jemand ne gute idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/159581/kann-man-hier-irgendwie-die-codewiederholungen-rausbekommen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 22:02:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/159581.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 16 Sep 2006 18:49:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kann man hier irgendwie die codewiederholungen rausbekommen? on Sat, 16 Sep 2006 18:49:05 GMT]]></title><description><![CDATA[<p>Ich bin grad dabei, eine kleine GUI zu schreiben, und bin dabei auf folgendes Problem gestoßen:</p>
<p>Für meine Nachrichten verteilung hab ich mich für einen VCL ähnlichen ansatz entschieden, ich hab also nicht für die fenster einen großen callback, sondern viele kleinere. Diese unterscheiden sich natürlich darin, welche parameter sie übergeben bekommen, etc und im endeffekt sieht meine Klasse nun(gekürzt) so aus:</p>
<pre><code class="language-cpp">class Object{
        private:
            Observer observer;
            //...
        protected:
            //diese funktionen werden von den abgeleiteten Objekten überschrieben,
            //die das event gesondert verarbeiten müssen
            virtual void ownSetTime(std::time_t time);

            virtual void ownMouseKlick(Button button,int x,int y);
            virtual void ownEnterKey(KeyState state,int key);
            virtual void ownWheelMove(int degree);
            //...

        public:

            //öffentliche schnittstelle
            void setTime(std::time_t time);

            void mouseKlick(Button button,int x,int y);
            void enterKey(KeyState state,int key);
            void wheelMove(int degree);
            //...
    };

    void Object::mouseKlick(Button button,int x,int y)
    {
        ownMouseKlick(button,x,y);

        //benachrichtigen der observer
        observer.mouseKlick(button,x,y,this);
    }
    //...

    class Observer{
        private:
            std::vector&lt;std::tr1::function&lt;void(Button,int,int,Object*)&gt; &gt; mouseKlick;
            //...
        public:
            void mouseKlick(Button button,int x,int y,Object* object);
            //...
    };
</code></pre>
<p>Das Problem ist nun natürlich, dass es unglaublich schwer ist, hier mal ein neues event einzuführen, da ich an vielen stellen rumfummeln müsste.</p>
<p>Hat da jemand ne gute idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1138718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138718</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 16 Sep 2006 18:49:05 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man hier irgendwie die codewiederholungen rausbekommen? on Sun, 17 Sep 2006 06:27:42 GMT]]></title><description><![CDATA[<p>Hmm irgendwie ist der ganze Ansatz müll. Was besseres hat mir meine Suche durchs Weg aber auch nicht ergeben, nur typunsichere ansätze, und das nervt. Verdammtes Eventsystem.</p>
<p>Zumindest bin ich mit diesem Ansatz nun (theoretisch)ein stück weiter gekommen:<br />
(wenn syntaxfehler drin sind, bitte übergehen, bis ich das durch den compiler jagen könnte, dauerts nochwas)</p>
<pre><code class="language-cpp">class Object{
        private:
            typedef ObserverList&lt;GanzVieleEvents&gt; Observer;
            Observer observer;
            //...
        protected:
            //diese funktionen werden von den abgeleiteten Objekten überschrieben,
            //die das event gesondert verarbeiten müssen(Ein Button zb ownMouseClick)
            virtual void ownSetTime(std::time_t time);

            virtual void ownMouseClick(Button button,int x,int y);
            virtual void ownEnterKey(KeyState state,int key);
            virtual void ownWheelMove(int degree);

            template&lt;class Tuple&gt;
            void dispatcher(Event event,const Tuple&amp; tuple){
                switch(Event)
                {
                    case MouseKlick:
                        ownMouseClick(std::tr1::get&lt;0&gt;(tuple),std::tr1::get&lt;1&gt;(tuple),std::tr1::get&lt;2&gt;(tuple));
                    break;
                    //...
                }
            }
        public:

            //öffentliche schnittstelle
            template&lt;Event event&gt;//ne enum
            void sendEvent(const Observer::Get&lt;event&gt;::TupleType&amp; tuple)
            {
                observer.call&lt;event&gt;(tuple,this);
                //dispatcher für die virtuellen funktionen
                dispatch(event,tuple);

            }
            template&lt;Event event&gt;
            void addObserver(const Observer::Get&lt;event&gt;::FunctorType&amp; functor)
            {
                observer.addObserver&lt;event&gt;(functor);   
            }
    };
</code></pre>
<p>Jetzt hab ich erreicht, dass ich nurnoch an dem Observer template und dem dispatcher rumspielen muss, wenn ich noch was hinzufügen will,aber wirklich zufrieden bin ich damit immernoch net. Wie gesagt, ich such schon nach nem andren Ansatz, aber im moment bin ich recht ratlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1138846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138846</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 17 Sep 2006 06:27:42 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man hier irgendwie die codewiederholungen rausbekommen? on Sun, 17 Sep 2006 09:06:02 GMT]]></title><description><![CDATA[<p>Hallo,<br />
mir ist der gewünschte Gesamtablauf noch nicht klar. Vielleicht hilft es, wenn du Beispielhaft mal beschreiben würdest, was genau ablaufen soll und wie dabei welche Objekte beteiligt sind (so Sequenzdiagramm mäßig).</p>
<p>Generell gefällt mir die Qt-Lösung recht gut (die Idee mehr als die konkrete Implementation). Dort werden einige Standard-Events über virtuelle Methoden behandelt, der Großteil dann aber über typsichere Signal-Slot-Verbindungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1138874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138874</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sun, 17 Sep 2006 09:06:02 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man hier irgendwie die codewiederholungen rausbekommen? on Sun, 17 Sep 2006 09:35:41 GMT]]></title><description><![CDATA[<p>Ok, ich versuch mich mal daran, dass übersichtlich zu gestalten.</p>
<p>Mal Als Beispiel ein OnKlick Event für einen Button.</p>
<pre><code>Button ist von Object abgeleitet und implementiert für die einzelnen Events 
die virtuellen funktionen. Bei Mouseklick würde er zb diese Klickanimation machen

//schritt1: es wird auf die GUI geklickt
//schritt2: es wird überprüft, welches Fenster genau getroffen wird

Klick(position x,y)
    |
    v
  __________    intersect(x,y)    ________________
 |Hauptmodul|  -------------&gt;    |  Alle Fenster   |
 |__________|  &lt;-------------    |_________________|
                antwort(Button)

//schritt3: an das Fenster wird das Event geschickt

  __________    MouseKlick        ___________
 |Hauptmodul|  -----------&gt;      |  Button   |
 |__________|                    |___________|  

//schritt 4: Der Button ruft zuerst seine eigene Verarbeitungsmethode auf
             (ownMouseKlick)

//schritt5: alle Objekte, die den Button beobachten, kriegen die nachricht
            über Observer gesendet, dass der Button geklickt wurde

 _________                       ____________              __________
|  Button |----&gt;ownMouseClick   |   Observer | mouseClick | Listener |
|         |                     |            |-----------&gt;|          |
|_________|-------------------&gt; |____________| _          |__________|
                 mouseClick                     |          __________   
                                                |         |Listener  |
                                                |--------&gt;|          |
                                                          |__________|

Die Listener reagieren dann darauf, dass der Button geklickt wurde.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1138884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138884</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 17 Sep 2006 09:35:41 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man hier irgendwie die codewiederholungen rausbekommen? on Mon, 18 Sep 2006 13:18:48 GMT]]></title><description><![CDATA[<p>Ich führ einfach mal weiter selbstgespräche, vielleicht komm ich dann zufällig auf den rechten weg :D.</p>
<p>Die Frage ist natürlich, wieso ich diese virtuellen funktionen überhaupt einbauen will. Immerhin liefert mir das selbst keinerlei vorteile, ausser dass ich in der abgeleiteten Klasse diese funktionen einfach überschreiben kann, und dann gehts los. Der Vorteil wäre also einfachkeit.</p>
<p>Nun...Unter diesen Annahmen könnte man doch(auch wenn es sehr eigensinnig wäre), diese virtuellen funktionen weglassen, und dafür im constructor der abgeleiteten Klasse einen callback in den Observer hängen.</p>
<p>Ich mein damit sowas(pseudocode):</p>
<pre><code class="language-cpp">class Button:public Object{
    private:
        void ownMouseClick(Button button,int x,int y){...}
    public:
        Button(){
            addObserver&lt;MouseClick&gt;(Functor(Button::ownMouseClick));
        }
};
</code></pre>
<p>Ich müsste halt nur dafür sorgen, dass dieser callback immer als erstes aufgerufen wird, aber das stuf ich mal als &quot;machbar&quot; ein.</p>
<p>natürlich hätte ich ein Problem, wenn ich dann ownMouseClick von Button nochmal überschreiben wollte, obwohl...an diesem ort würde ownMouseClick als virtuelle funktion wohl keine Probleme bereiten...hmm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1139608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1139608</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Mon, 18 Sep 2006 13:18:48 GMT</pubDate></item></channel></rss>