<?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[Verständnisproblem bei libsigc++]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich versuche grade mich ein wenig mit der libsigc++ vertraut zu machen.<br />
Nutzen möchte ich das ganze später um einen Datenfluss zwischen verschiedenen<br />
Modulen zu realisieren, so nach diesem Prinzip: <a href="http://images.gamedev.net/features/reviews/maya6/Figure2.jpg" rel="nofollow">http://images.gamedev.net/features/reviews/maya6/Figure2.jpg</a></p>
<p>Der Gedanke dabei ist folgender: Jedes Modul besitzt ein Signal, und eine Funktion, sowas wie</p>
<pre><code class="language-cpp">modul01.go()
</code></pre>
<p>Wenn ein Modul alle Berechnungen abgeschlossen hat, löst es sein Signal aus, welches an die go()-Funktion des nächsten Modules gebunden ist. Das Prinzip an sich funktioniert auch, Probleme habe dabei, die Signale mit der jeweiligen nächsten Funktion zu verbinden.</p>
<p>Im moment sieht das ganze etwa so aus:</p>
<pre><code class="language-cpp">modul01.sig_pass_data.connect( sigc::mem_fun(modul02, &amp;modul::go) );
</code></pre>
<p>Soweit ich das richtig verstanden hab erwartet die connect()-Funktion einen Funktor, welcher von sigc::mem_fun() aus dem jeweiligen Objekt und einem weiteren Argument, welches ich nicht verstehe, zusammengesetz wird.</p>
<p>Da man später die Module je nach bedarf zusammenschalten können soll ist beim kompilieren natürlich noch nicht klar, welches Signal woran gekoppelt wird.<br />
Auch würde ich gerne später jedem Modul eine connect()-Funktion geben, der man nur mitteilen muss, an welches Objekt sie das Signal binden soll.<br />
Was also her muss, ist eine Lösung, die in der Lage ist dieses zweite Argument dem ersten anzupassen. (Das erste könnte ja recht einfach als mit einem Pointer übergeben werden)</p>
<p>Meine Fragen sind also:<br />
-&gt;Was ist das zweite Argument?<br />
-&gt;Kann ich das Argument aus den Informationen, die ich über ein Objekt herausfinden kann erhalten?</p>
<p>Oder wäre vielleicht ein komplett anderer Weg sinnvoller?</p>
<p>Danke schonmal, und viele Grüße!<br />
Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261844/verständnisproblem-bei-libsigc</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 02:46:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261844.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Feb 2010 15:31:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisproblem bei libsigc++ on Wed, 24 Feb 2010 15:31:55 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich versuche grade mich ein wenig mit der libsigc++ vertraut zu machen.<br />
Nutzen möchte ich das ganze später um einen Datenfluss zwischen verschiedenen<br />
Modulen zu realisieren, so nach diesem Prinzip: <a href="http://images.gamedev.net/features/reviews/maya6/Figure2.jpg" rel="nofollow">http://images.gamedev.net/features/reviews/maya6/Figure2.jpg</a></p>
<p>Der Gedanke dabei ist folgender: Jedes Modul besitzt ein Signal, und eine Funktion, sowas wie</p>
<pre><code class="language-cpp">modul01.go()
</code></pre>
<p>Wenn ein Modul alle Berechnungen abgeschlossen hat, löst es sein Signal aus, welches an die go()-Funktion des nächsten Modules gebunden ist. Das Prinzip an sich funktioniert auch, Probleme habe dabei, die Signale mit der jeweiligen nächsten Funktion zu verbinden.</p>
<p>Im moment sieht das ganze etwa so aus:</p>
<pre><code class="language-cpp">modul01.sig_pass_data.connect( sigc::mem_fun(modul02, &amp;modul::go) );
</code></pre>
<p>Soweit ich das richtig verstanden hab erwartet die connect()-Funktion einen Funktor, welcher von sigc::mem_fun() aus dem jeweiligen Objekt und einem weiteren Argument, welches ich nicht verstehe, zusammengesetz wird.</p>
<p>Da man später die Module je nach bedarf zusammenschalten können soll ist beim kompilieren natürlich noch nicht klar, welches Signal woran gekoppelt wird.<br />
Auch würde ich gerne später jedem Modul eine connect()-Funktion geben, der man nur mitteilen muss, an welches Objekt sie das Signal binden soll.<br />
Was also her muss, ist eine Lösung, die in der Lage ist dieses zweite Argument dem ersten anzupassen. (Das erste könnte ja recht einfach als mit einem Pointer übergeben werden)</p>
<p>Meine Fragen sind also:<br />
-&gt;Was ist das zweite Argument?<br />
-&gt;Kann ich das Argument aus den Informationen, die ich über ein Objekt herausfinden kann erhalten?</p>
<p>Oder wäre vielleicht ein komplett anderer Weg sinnvoller?</p>
<p>Danke schonmal, und viele Grüße!<br />
Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860675</guid><dc:creator><![CDATA[PixelRealm]]></dc:creator><pubDate>Wed, 24 Feb 2010 15:31:55 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem bei libsigc++ on Wed, 24 Feb 2010 15:49:18 GMT]]></title><description><![CDATA[<p>PixelRealm schrieb:</p>
<blockquote>
<p>Oder wäre vielleicht ein komplett anderer Weg sinnvoller?</p>
</blockquote>
<p>Du musst wohl irgendwo eine speichernde Struktur haben, in der alle Module liegen. Sonst hättest du nicht die Möglichkeit, verschiedene Module hinzuzufügen und die Ablaufreihenfolge zu ändern. Gib doch dieser Struktur Methoden, um die Ablaufreihenfolge anzupassen und eine initiale go()-Funktion, die dann der Reihe nach alle go() der Modulinstanzen aufruft. Das geht dann komplett ohne sigc++.</p>
<p>Dieses Signal/Slot-Konzept macht dann Sinn, wenn es möglich sein soll, mehrere Objekte, die an unterschiedlichen Orten (Objekten) gespeichert sind, an ein Signal zu hängen, eben auch dynamisch während der Laufzeit. Bei dir wird das Konzept nur verwendet, um eine Ablaufreigenfolge zu definieren. Das geht auch ohne diesen Umweg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860688</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 24 Feb 2010 15:49:18 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem bei libsigc++ on Wed, 24 Feb 2010 17:29:21 GMT]]></title><description><![CDATA[<p>Ansich bin ich von der Idee, das sich das Netz sozusagen selber managed, indem jedes Modul nur weiß, woher es seine Daten beziehen soll, und wann es losrechnen soll recht angetan, weil man sich dabei nicht darum kümmern muss dass es läuft. Auch sind Verzweigungen oder mehrfache Ein/Ausgänge verhältnismäßig leicht zu realisieren.</p>
<p>Das man dafür die Signale nicht benötigt, erscheint mir inzwischen auch logisch.<br />
Wenn ich zwei Module anlege, von denen ich weiß, dass sie z.B diese go()-Funktion haben, dann kann ich diese Funktion ja von überall nach diesem Prinzip aufrufen:</p>
<pre><code class="language-cpp">Modul* Pointer_Auf_Modul = &amp;Modul01;
Pointer_Auf_Modul-&gt;go();
</code></pre>
<p>Wo es jetzt wieder scheitert ist die Deklaration des Pointers, der muss ja vom Typ &quot;Modul&quot; sein. Das weiß ich aber erst, wenn alles schon kompiliert ist. Mit void* funktioniert das nicht. Gibts da ne Möglichkeit, dieses Problem zu lösen, oder habe ich falsche Vorstellungen davon, wie so ein Zeiger funktioniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860738</guid><dc:creator><![CDATA[PixelRealm]]></dc:creator><pubDate>Wed, 24 Feb 2010 17:29:21 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem bei libsigc++ on Wed, 24 Feb 2010 18:23:31 GMT]]></title><description><![CDATA[<p>Du kannst keine Funktion aufrufen, ohne den Typ zu kennen. Ich denke du möchtest Polymorphie.</p>
<pre><code class="language-cpp">class Module {
    Module* next_;
public:
    Module()
     : next_(0)
    {}

    virtual ~Module() {
        delete next_;
    }

    void setNext(Module* m) {
        m-&gt;next_ = next_;
        next_ = m;
    }

    virtual void go()=0;
};

void
Module::go() {
    if( next_ ) next_-&gt;go();
}

class NewMod : public Module
{
public:
    void go() {
        cout &lt;&lt; &quot;NewMod::go()&quot; &lt;&lt; endl;
        Module::go();
    }
};
</code></pre>
<p>Es gibt aber ein kleines Problem: Anwachsender Stack! Der Stack von go() wird erst aufgeräumt, wenn das go() von next fertig ist. Wenn du viele Module verkettest, und die teilweise richtig viel Speicher brauchen (z.B. jedes Module sein eigenes monster DOMTree), kann das problematisch werden - in heutigen Zeiten sicher weniger.<br />
Vorteil: schneller Ablauf der Berechnungen, da die Aufräumarbeiten an einem Stück nach den ganzen Berechnungen ablaufen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Das selbe gilt aber auch für sigc++ (resp. boost::signal).<br />
Kann man natürlich umgehen, indem man die Logik in nen eigenen Scope legt.</p>
<pre><code class="language-cpp">class NewMod2 : public Module
{
public:
    void go() {
        {
            dom_document doc(&quot;big_xml.xml&quot;);
            /* usw*/
        }
        Module::go();
    }
};
</code></pre>
<p>Ein iterativer Ansatz würde so ausschauen.</p>
<pre><code class="language-cpp">std::vector&lt;Module*&gt; modules;
foreach(Module* mod, modules) {
    mod-&gt;go();
}
</code></pre>
<p>Was anderes fällt mir nicht ein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860745</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 24 Feb 2010 18:23:31 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem bei libsigc++ on Wed, 24 Feb 2010 19:25:06 GMT]]></title><description><![CDATA[<p>Ich hab mir Polymorphie mal angeguckt und ein bisschen experimentiert, und ich glaube das Problem ist gelöst. Und zwar so:</p>
<p>Ich habe eine Klasse angelegt die Nur aus Konstruktor, Destruktor und eine Funktion, go(), besteht. go() ist als virtual deklariert.<br />
Alle Modulklassen erben von dieser Klasse. Der Vorteil: ich kann, wenn ich einen Pointer vom Typ der Vaterklasse anlege, mit diesem auf alle Instanzen der Kindklassen zeigen lassen, und auch deren go()-Funktion aufrufen.<br />
So brauch jedes Modul nur zu wissen, welches Modul an es selber angeschlossen ist, um diesem sozusagen das Startzeichen zukommen zu lassen...</p>
<p>Wie viel Speicher das Programm am Ende verbrauchen wird kann ich nicht abschätzen, vor allem weil ich erstmal testen wollte ob diese Netzwerk-Idee überhaupt funktioniert.<br />
Vielen Dank aber auf jeden Fall für die Hilfe und das entscheidende Stichwort! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860767</guid><dc:creator><![CDATA[PixelRealm]]></dc:creator><pubDate>Wed, 24 Feb 2010 19:25:06 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem bei libsigc++ on Wed, 24 Feb 2010 20:11:19 GMT]]></title><description><![CDATA[<p>Du solltest den Destruktor der Klasse unbedingt virtuell machen, wenn diese polymorph ist (also andere virtuelle Funktionen enthält). In abgeleiteten Klassen musst du den Destruktor nicht explizit deklarieren, er ist automatisch virtuell, falls der Destruktor einer Basisklasse bereits virtuell ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860784</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:11:19 GMT</pubDate></item></channel></rss>