<?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[Callback und Templateklasse]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich mal wieder. Folgendes Problem:</p>
<p>Ich habe eine Templateklasse und eine Funktion. Die Funktion soll eine Methode aus der Templateklasse aufrufen:</p>
<pre><code class="language-cpp">void handleCallback( int bla )
{
    //Problem:
    //Hier soll update() aus Bar aufgerufen werden.
}

template&lt; typename Foo &gt;
    class Bar
{
    void loop( )
    {
        //Wird bei bestimmten Events aufgerufen, kann ich nicht beeinflussen.
        callback = handleCallback;

        //'callback' ist ein Funktionszeiger:
        //extern void (*func)(int param); 
    }

    //Soll aufgerufen werden, sobald etwas passiert ist.
    bool update( Anything &amp;doesnt_work )
    {
        //do something...
        return true;
    }
}
</code></pre>
<p>An der Signatur von <code>handleCallback</code> kann ich nix ändern. Wie kann ich aus dieser Funktion aber Bar bescheid sagen, das etwas passiert ist? Konkret will ich die update()-Methode aus Bar aufrufen.<br />
Ist das überhaupt möglich? (mit meinen Kenntnissen nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> )<br />
Kann jemand helfen?</p>
<p>MfG. Christoph Ludwig</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264588/callback-und-templateklasse</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 16:50:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264588.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Apr 2010 15:49:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Callback und Templateklasse on Fri, 09 Apr 2010 15:49:12 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich mal wieder. Folgendes Problem:</p>
<p>Ich habe eine Templateklasse und eine Funktion. Die Funktion soll eine Methode aus der Templateklasse aufrufen:</p>
<pre><code class="language-cpp">void handleCallback( int bla )
{
    //Problem:
    //Hier soll update() aus Bar aufgerufen werden.
}

template&lt; typename Foo &gt;
    class Bar
{
    void loop( )
    {
        //Wird bei bestimmten Events aufgerufen, kann ich nicht beeinflussen.
        callback = handleCallback;

        //'callback' ist ein Funktionszeiger:
        //extern void (*func)(int param); 
    }

    //Soll aufgerufen werden, sobald etwas passiert ist.
    bool update( Anything &amp;doesnt_work )
    {
        //do something...
        return true;
    }
}
</code></pre>
<p>An der Signatur von <code>handleCallback</code> kann ich nix ändern. Wie kann ich aus dieser Funktion aber Bar bescheid sagen, das etwas passiert ist? Konkret will ich die update()-Methode aus Bar aufrufen.<br />
Ist das überhaupt möglich? (mit meinen Kenntnissen nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> )<br />
Kann jemand helfen?</p>
<p>MfG. Christoph Ludwig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880170</guid><dc:creator><![CDATA[ChristophLu]]></dc:creator><pubDate>Fri, 09 Apr 2010 15:49:12 GMT</pubDate></item><item><title><![CDATA[Reply to Callback und Templateklasse on Fri, 09 Apr 2010 15:55:53 GMT]]></title><description><![CDATA[<p>Es gibt kein Bar. Es gibt nur verschiedene Bar&lt;Foo&gt;. Welches Foo darf es denn sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880175</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 09 Apr 2010 15:55:53 GMT</pubDate></item><item><title><![CDATA[Reply to Callback und Templateklasse on Fri, 09 Apr 2010 15:59:15 GMT]]></title><description><![CDATA[<p>Ja eben, das ist es ja, was mich stört.<br />
Kann man das irgendwie umgehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880178</guid><dc:creator><![CDATA[ChristophLu]]></dc:creator><pubDate>Fri, 09 Apr 2010 15:59:15 GMT</pubDate></item><item><title><![CDATA[Reply to Callback und Templateklasse on Fri, 09 Apr 2010 16:00:45 GMT]]></title><description><![CDATA[<p>Wie soll deiner Meinung nach handleCallback ein Bla informieren, wenn der Funktion kein derartiges Objekt übergeben werden kann? handleCallback ist dahingehend schlecht designed. Denn für UserData gibt man meistens noch nen void-Pointer mit, den man sich je nach Situation zurechtcastet.<br />
Die einzige Möglichkeit die ich sehe wäre entweder ein globales Bar-Objekt, oder ein Manager, der Bar-Objekte verwaltet und dem du dann je nach Bedarf Objekte entnehmen kannst.</p>
<p>Da aber callback ein Member ist, möchtest du wohl dass callback auch &quot;this&quot; kennt/verwendet. Das wird nicht leicht sein...<br />
Was soll eigentlich dieser &quot;int bla&quot;-Parameter genau an/darstellen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880179</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Fri, 09 Apr 2010 16:00:45 GMT</pubDate></item><item><title><![CDATA[Reply to Callback und Templateklasse on Fri, 09 Apr 2010 16:08:05 GMT]]></title><description><![CDATA[<blockquote>
<p>Wie soll deiner Meinung nach handleCallback ein Bla informieren</p>
</blockquote>
<p>Weis ich nicht. Deshalb frag ich doch.</p>
<blockquote>
<p>Da aber callback ein Member ist,...</p>
</blockquote>
<p>Falsch. Konkret:<br />
callback ist nen Funktionszeiger aus dem Framework, welches ich verwende: <a href="http://www.allegro.cc/manual/api/mouse-routines/mouse_callback" rel="nofollow">http://www.allegro.cc/manual/api/mouse-routines/mouse_callback</a></p>
<p>Und das kann ich nunmal nicht ändern.</p>
<p>Aber aus den 2 Antworten höre ich raus, das dies nicht möglich ist(, was ich mir ja schon gedacht hab). Hätte ja sein können, ihr kennt einen Trick dazu...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880185</guid><dc:creator><![CDATA[ChristophLu]]></dc:creator><pubDate>Fri, 09 Apr 2010 16:08:05 GMT</pubDate></item><item><title><![CDATA[Reply to Callback und Templateklasse on Fri, 09 Apr 2010 16:10:26 GMT]]></title><description><![CDATA[<p>ChristophLu schrieb:</p>
<blockquote>
<p>Ja eben, das ist es ja, was mich stört.<br />
Kann man das irgendwie umgehen?</p>
</blockquote>
<p>Nein, denn es gibt schlicht und einfach kein Bar. Du musst uns daher die Frage beantworten, was du mit Bar ohne Templateparameter meinst, dann kann man eventuell eine Lösung finden.<br />
Um Mal einen Vergleich zu bringen: Im Moment hast du eine Plätzchenform und willst die Methode essen() aufrufen, die es aber nur für fertige Plätzchen gibt. Also sag uns, was du mit dem essen() der Plätzchenform erreichen willst. Willst du dadurch vielleicht alle Plätzchen auf einmal essen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880187</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 09 Apr 2010 16:10:26 GMT</pubDate></item><item><title><![CDATA[Reply to Callback und Templateklasse on Fri, 09 Apr 2010 16:23:32 GMT]]></title><description><![CDATA[<p>Ist das denn so schwer zu verstehen, Sepp?</p>
<p>Anwendung:</p>
<pre><code class="language-cpp">#include &quot;Bla.hpp&quot;

int main()
{
    Bla&lt;int&gt; x;
    x.loop();
}
</code></pre>
<p>Nehmen wir an, das Callback sagt Bescheid, wenn die Maus sich ändert. Dann soll update() eine Meldung ausgeben, das sich die Maus geändert hat. Das ist das Ziel.<br />
Mit den gegebenen Möglichkeiten(dadurch, das Bla ein Template ist und die eigentliche Callback eher ungeeignet zu sein scheint) geht es demnach nicht(bzw. mir wäre nichts bekannt).</p>
<p>Wenn ich so überlege: Kann man nicht eine Basis-Klasse mit den virtuellen Methoden loop() und update() erstellen und von der Basis-Klasse nen globalen Zeiger speichern. Dann könnte handleCallback doch darauf zugreifen oder? Nur müsste ich dann Bla als Singleton machen, da sich das bei mehreren Instanzen zwickt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880194</guid><dc:creator><![CDATA[ChristophLu]]></dc:creator><pubDate>Fri, 09 Apr 2010 16:23:32 GMT</pubDate></item><item><title><![CDATA[Reply to Callback und Templateklasse on Fri, 09 Apr 2010 16:40:36 GMT]]></title><description><![CDATA[<p>Ich stimme zu. Das einzige was mir dazu einfällt ist ein globales Objekt. Wie das konkret am optimalsten aussieht, kommt auf die Details an. Anders als global jedenfalls wirst du von der callback-Funktion nichts ansprechen können, das außerhalb von ihrem Scope liegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880200</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 09 Apr 2010 16:40:36 GMT</pubDate></item><item><title><![CDATA[Reply to Callback und Templateklasse on Fri, 09 Apr 2010 16:55:51 GMT]]></title><description><![CDATA[<p>Gut, dann werd ich das so probieren. Mein Ansatz wäre etwas in der Art:</p>
<pre><code class="language-cpp">//Damit ich das Problem mit den Templates nicht mehr hab.
struct BasicBla
{
    virtual bool loop( ) = 0;
    virtual bool update( ) = 0;
};

//Damit handleCallback auf Bla&lt;...&gt; zugreifen kann.
BasicBla *globalBla = NULL;

//Wird bei einem Event aufgerufen.
void handleCallback( int blubb )
{
    if( globalBla != NULL )
    {
        globalBla-&gt;update();
    }
}

//Für den User
template&lt; typename Foo &gt;
    class Bla : public BasicBla
{
    Bla( )
    {
        //Im einfachsten Fall kann ich doch hier prüfen, ob globalBla != NULL ist. So in etwa:
        if( globalBla != NULL )
        {
            throw std::runtime_error( &quot;Bla existiert schon!&quot; );
        }

        //Diese instanz global speichern, damit handleCallback darauf zugreifen kann.
        globalBla = this;
    }
    bool loop( )
    {
        callback = handleCallback;
    }
    bool update( )
    {
        //...
    }
};

int main()
{
    Bla&lt;int&gt; x;
    x.loop();
    return 0;
}
</code></pre>
<p>Kann man das so machen oder gibts da bessere Wege?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880203</guid><dc:creator><![CDATA[ChristophLu]]></dc:creator><pubDate>Fri, 09 Apr 2010 16:55:51 GMT</pubDate></item><item><title><![CDATA[Reply to Callback und Templateklasse on Fri, 09 Apr 2010 19:10:09 GMT]]></title><description><![CDATA[<p>Hmm, da stellt sich mir ein weiteres Problem auf.<br />
Jetz hab ich das so Umgesetzt wie oben geschrieben, nur hab ich jetzt logischerweise das Problem, das sich mein Programm beendet, weil kein Event kommt.</p>
<p>Schematisch sieht meine loop()-Funktion so aus:</p>
<pre><code>function loop
    callback setzen
end
</code></pre>
<p>Nach dem callback-setzen wird sie logischerweise beendet. Was mach ich jetzt? Wie &quot;warte&quot; ich auf die Events?</p>
<p>Das ganze hab ich ja gemacht, damit ich vom ressourcenfressenden Polling auf schonendere Interrupts wechsle. Also kann ich ja schlecht mit ner While-Schleife auf Nachrichten warten. Dann hab ich ja wieder Polling...</p>
<p>Sollte dann also etwa so aussehen:</p>
<pre><code class="language-cpp">function loop
    callbacks setzen
    irgendwie warten
end
</code></pre>
<p>Jemand ne Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880254</guid><dc:creator><![CDATA[ChristophLu]]></dc:creator><pubDate>Fri, 09 Apr 2010 19:10:09 GMT</pubDate></item><item><title><![CDATA[Reply to Callback und Templateklasse on Fri, 09 Apr 2010 20:00:54 GMT]]></title><description><![CDATA[<p>Hat sich erledigt. Ab und zu sollte man die Doku lesen <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 />
rest() ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880263</guid><dc:creator><![CDATA[ChristophLu]]></dc:creator><pubDate>Fri, 09 Apr 2010 20:00:54 GMT</pubDate></item></channel></rss>