<?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 Funktionen und deren Aufrufe]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>Ich habe eine Frage im Bezug auf Callback Funktionen:</p>
<p>Ich habe 2 Klassen wovon eine, unter bestimmten Bedingung, die FUnktion der<br />
zweiten Klassen aufruft(callback). Dazu habe ich auch eine main.cpp zur Erzeugung<br />
aller Instanzen.</p>
<pre><code class="language-cpp">// Erste Klasse, nachdem eine bestimmte Bedingung bei dem Aufruf
// von listen_port dieser Klasse eingetreten ist, wird die callback executiert.

void Worker::listen_port(unsigned short upper_bound, void* nm, void (NonsenseManager::*meth_ptr)(void* ptr2obj, unsigned int index) ){

    std::srand(time(NULL)) ;
    unsigned short i = upper_bound ;
    unsigned int number ;

        for( ; i &gt;=0 ; i--)
            if(i &gt; 1) 
                while ( (number = std::rand() %i) == 0 )
                    ( ((NonsenseManager *)nm)-&gt;*meth_ptr)((void *)nm, i) ; // callback
             else ( ((NonsenseManager *)nm)-&gt;*meth_ptr)((void *)nm, i) ; // callback ;
}
//........

// Zweite Klasse deren Funktion als &quot;callback&quot; aufgerufen wird.
void NonsenseManager::func_quad(unsigned int index){

    values_container[index] = index * index ;
}       

// statische callback function, forwards query to another method         
void NonsenseManager::wrapper_func(void* ptr2obj, unsigned int index){

    NonsenseManager* active = (NonsenseManager *) ptr2obj ;
    cout &lt;&lt; __FUNCTION__ &lt;&lt; &quot;:callback has been called for index:&quot; &lt;&lt; index &lt;&lt; endl;
    active-&gt;func_quad(index) ;
}
</code></pre>
<p>Bis jetzt klappt alles gut, wenn ich aber durch einen main.cpp die<br />
Worker-&gt;listen_port() aufrufen moechte:</p>
<pre><code class="language-cpp">// von main.cpp
int main(void)
{

    unsigned short upper = 20 ;
    NonsenseManager* nm = new NonsenseManager(upper) ;
    cout &lt;&lt; __FUNCTION__ &lt;&lt; &quot;: nonsense manager created&quot; &lt;&lt; endl;
    unsigned int i =0 ;

    Worker* workoholic = new Worker() ;
    workoholic-&gt;listen_port(upper, (void *) nm, &amp;NonsenseManager::wrapper_func); // hier meckert der compiler
    cout &lt;&lt; __FUNCTION__ &lt;&lt; &quot;: hold tight, workoholic on air&quot; &lt;&lt; endl;

return 0;
}
</code></pre>
<p>kriege ich einen Fehlermeldung wie:</p>
<blockquote>
<p>main.cpp:18: error: no matching function for call to ‘Worker::listen_port(short unsigned int&amp;, void*, void (<em>)(void</em>, unsigned int))’<br />
Worker.h:19: note: candidates are: void Worker::listen_port(short unsigned int, void*, void (NonsenseManager::<em>)(void</em>, unsigned int))</p>
</blockquote>
<p>Wieso klappt der Aufruf von</p>
<pre><code class="language-cpp">workoholic-&gt;listen_port(upper, (void *) nm, &amp;NonsenseManager::wrapper_func);
</code></pre>
<p>nicht? Ich sehe den Fehler nicht, weil, sowie es bei den Beispielen gezeigt wird,<br />
muesste so klappen..(Ich habe bei meiner ersten callback implementation im Netz<br />
vorhandenen Beispiele gefolgt. )<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-126801-and-highlight-is-callback.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-126801-and-highlight-is-callback.html</a><br />
<a href="http://www.newty.de/fpt/callback.html#chapter3" rel="nofollow">http://www.newty.de/fpt/callback.html#chapter3</a></p>
<p>Danke im voraus,</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/212198/callback-funktionen-und-deren-aufrufe</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 18:10:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/212198.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 02 May 2008 21:06:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Callback Funktionen und deren Aufrufe on Fri, 02 May 2008 22:59:13 GMT]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>Ich habe eine Frage im Bezug auf Callback Funktionen:</p>
<p>Ich habe 2 Klassen wovon eine, unter bestimmten Bedingung, die FUnktion der<br />
zweiten Klassen aufruft(callback). Dazu habe ich auch eine main.cpp zur Erzeugung<br />
aller Instanzen.</p>
<pre><code class="language-cpp">// Erste Klasse, nachdem eine bestimmte Bedingung bei dem Aufruf
// von listen_port dieser Klasse eingetreten ist, wird die callback executiert.

void Worker::listen_port(unsigned short upper_bound, void* nm, void (NonsenseManager::*meth_ptr)(void* ptr2obj, unsigned int index) ){

    std::srand(time(NULL)) ;
    unsigned short i = upper_bound ;
    unsigned int number ;

        for( ; i &gt;=0 ; i--)
            if(i &gt; 1) 
                while ( (number = std::rand() %i) == 0 )
                    ( ((NonsenseManager *)nm)-&gt;*meth_ptr)((void *)nm, i) ; // callback
             else ( ((NonsenseManager *)nm)-&gt;*meth_ptr)((void *)nm, i) ; // callback ;
}
//........

// Zweite Klasse deren Funktion als &quot;callback&quot; aufgerufen wird.
void NonsenseManager::func_quad(unsigned int index){

    values_container[index] = index * index ;
}       

// statische callback function, forwards query to another method         
void NonsenseManager::wrapper_func(void* ptr2obj, unsigned int index){

    NonsenseManager* active = (NonsenseManager *) ptr2obj ;
    cout &lt;&lt; __FUNCTION__ &lt;&lt; &quot;:callback has been called for index:&quot; &lt;&lt; index &lt;&lt; endl;
    active-&gt;func_quad(index) ;
}
</code></pre>
<p>Bis jetzt klappt alles gut, wenn ich aber durch einen main.cpp die<br />
Worker-&gt;listen_port() aufrufen moechte:</p>
<pre><code class="language-cpp">// von main.cpp
int main(void)
{

    unsigned short upper = 20 ;
    NonsenseManager* nm = new NonsenseManager(upper) ;
    cout &lt;&lt; __FUNCTION__ &lt;&lt; &quot;: nonsense manager created&quot; &lt;&lt; endl;
    unsigned int i =0 ;

    Worker* workoholic = new Worker() ;
    workoholic-&gt;listen_port(upper, (void *) nm, &amp;NonsenseManager::wrapper_func); // hier meckert der compiler
    cout &lt;&lt; __FUNCTION__ &lt;&lt; &quot;: hold tight, workoholic on air&quot; &lt;&lt; endl;

return 0;
}
</code></pre>
<p>kriege ich einen Fehlermeldung wie:</p>
<blockquote>
<p>main.cpp:18: error: no matching function for call to ‘Worker::listen_port(short unsigned int&amp;, void*, void (<em>)(void</em>, unsigned int))’<br />
Worker.h:19: note: candidates are: void Worker::listen_port(short unsigned int, void*, void (NonsenseManager::<em>)(void</em>, unsigned int))</p>
</blockquote>
<p>Wieso klappt der Aufruf von</p>
<pre><code class="language-cpp">workoholic-&gt;listen_port(upper, (void *) nm, &amp;NonsenseManager::wrapper_func);
</code></pre>
<p>nicht? Ich sehe den Fehler nicht, weil, sowie es bei den Beispielen gezeigt wird,<br />
muesste so klappen..(Ich habe bei meiner ersten callback implementation im Netz<br />
vorhandenen Beispiele gefolgt. )<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-126801-and-highlight-is-callback.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-126801-and-highlight-is-callback.html</a><br />
<a href="http://www.newty.de/fpt/callback.html#chapter3" rel="nofollow">http://www.newty.de/fpt/callback.html#chapter3</a></p>
<p>Danke im voraus,</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502338</guid><dc:creator><![CDATA[jsbach]]></dc:creator><pubDate>Fri, 02 May 2008 22:59:13 GMT</pubDate></item><item><title><![CDATA[Reply to Callback Funktionen und deren Aufrufe on Fri, 02 May 2008 21:45:43 GMT]]></title><description><![CDATA[<p>Wie sieht den der Header aus? Also die Deklarationen?</p>
<p>Im übrigen würde ich dir empfehlen das über Templates zu lösen. Dann kannst du das mit dem void* casten auch gerade weglassen.</p>
<p>btw.<br />
Da fehlen auch noch deletes. <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502347</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 02 May 2008 21:45:43 GMT</pubDate></item><item><title><![CDATA[Reply to Callback Funktionen und deren Aufrufe on Fri, 02 May 2008 22:21:02 GMT]]></title><description><![CDATA[<p>Hallo drakon,</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Wie sieht den der Header aus? Also die Deklarationen?</p>
</blockquote>
<p>die header dateien sehen so aus:</p>
<pre><code class="language-cpp">// von Worker.h

class Worker
{

    public:
        Worker() ;
        virtual ~Worker() ;
        void listen_port(unsigned short upper_bound, void* nm, void (NonsenseManager::*meth_ptr)(void* ptr2obj, unsigned int index)); 

};

// von NonsenseManager.h

class NonsenseManager
{   
    public:
        NonsenseManager(unsigned short no) ;
        virtual ~NonsenseManager() ;
        static void wrapper_func(void* ptr2obj, unsigned int index) ; //callback signatur
        void func_quad(unsigned int index) ;
        void dumpNonsense();

    private: 
        unsigned int* values_container ;
        unsigned short upper_bound ;

};
</code></pre>
<blockquote>
<p>Im übrigen würde ich dir empfehlen das über Templates zu lösen. Dann kannst du das mit dem void* casten auch gerade weglassen.</p>
</blockquote>
<p>ok, danke fuer die Empfehlung. Es geht gerade fuer mich darum, dass ich<br />
mal nachvollziehe wie callback Funktionen bei c++ implementiert werden.<br />
Deswegen dieser Weg...</p>
<blockquote>
<p>btw.<br />
Da fehlen auch noch deletes. <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="😉"
    /></p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> haste recht, bin gerade dabei...</p>
<p>Gruss,</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502360</guid><dc:creator><![CDATA[jsbach]]></dc:creator><pubDate>Fri, 02 May 2008 22:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to Callback Funktionen und deren Aufrufe on Sat, 03 May 2008 02:46:49 GMT]]></title><description><![CDATA[<p>Der Fehler lag daran, dass eine statische member function keine this pointer<br />
annehmen darf. Solche statische Funktionen sind direkt addressierbar. Da der<br />
callback-funktion so deklariert ist:</p>
<pre><code class="language-cpp">static void wrapper_func(void* ptr2obj, unsigned int index) ; //callback signatur
</code></pre>
<p>ist die richtige version von listen_port:</p>
<pre><code class="language-cpp">void Worker::listen_port(unsigned short upper_bound, void* nm, void (*meth_ptr)(void* ptr2obj, unsigned int index) ){

    std::srand(time(NULL)) ;
    unsigned short i = upper_bound ;
    unsigned int number ;

        for( ; i &gt;=0 ; i--)
            if(i &gt; 1) 
                while ( (number = std::rand() %i) == 0 )
                    (*meth_ptr)((void *)nm, i) ; // callback
             else (*meth_ptr)((void *)nm, i) ; // callback ;
}
</code></pre>
<p>Gruss,</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502417</guid><dc:creator><![CDATA[jsbach]]></dc:creator><pubDate>Sat, 03 May 2008 02:46:49 GMT</pubDate></item><item><title><![CDATA[Reply to Callback Funktionen und deren Aufrufe on Sat, 03 May 2008 07:40:45 GMT]]></title><description><![CDATA[<p>Ich würde das mit Interface-Klassen lösen. Je nach komplexität bzw. gewünschter Flexibilität, wären Templates hier vielleicht etwas übertrieben.</p>
<p>Irgendwie so z.B.:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

//Interface
class ICallbackInterface
{
public:
    virtual int someCallback(int param1, int param2) = 0;
};

//callback handler: verwaltet callbacks und führt sie aus
class CCallbackHandler
{
public:
    //registriert callbacks
    void addCallback(ICallbackInterface&amp; callback)
    {
        myCallbacks.push_back(&amp;callback);
    }

    //ruft alle registrierten callbacks auf
    void executeCallbacks()
    {
        for(std::vector&lt;ICallbackInterface*&gt;::iterator iter = myCallbacks.begin(); iter != myCallbacks.end(); ++iter)
        {
            std::cout &lt;&lt; (*iter)-&gt;someCallback(1, 3) &lt;&lt; '\n';
        }
    }

private:
    //speichert die registrierten callbacks
    std::vector&lt;ICallbackInterface*&gt; myCallbacks;
};

//bindet das interface ein und kann daher beim handler registriert werden
class CCallbackUser1 : public ICallbackInterface
{
public:
    virtual int someCallback(int param1, int param2)
    {
        return param1 + param2;
    }
};

//bindet das interface ein und kann daher beim handler registriert werden
class CCallbackUser2 : public ICallbackInterface
{
public:
    virtual int someCallback(int param1, int param2)
    {
        return param1 * param2;
    }
};

int main( )
{
    //callbacks
    CCallbackUser1 cbu1;
    CCallbackUser2 cbu2;

    //handler
    CCallbackHandler handler;

    //callbacks registrieren...
    handler.addCallback(cbu1);
    handler.addCallback(cbu2);

    //...und ausfuehren
    handler.executeCallbacks();
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1502434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502434</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sat, 03 May 2008 07:40:45 GMT</pubDate></item><item><title><![CDATA[Reply to Callback Funktionen und deren Aufrufe on Sat, 03 May 2008 12:12:35 GMT]]></title><description><![CDATA[<p>jsbach schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Wobei sich natürlich die Frage stellt, warum das static, bzw. IN der Klasse ist. Da könntest du natürlich die Funktion aus der Klasse nehmen, da sie ja nix davon nix wissen muss/kann/darf.</p>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Ich würde das mit Interface-Klassen lösen. Je nach komplexität bzw. gewünschter Flexibilität, wären Templates hier vielleicht etwas übertrieben.</p>
</blockquote>
<p>In seinem Fall wäre das wahrscheinlich eleganter. Jedoch wollte er Methoden Pointer verstehen. Da hilft es ihm nix, wenn er dann ein Interface draus macht. <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 />
Wenn ich Templates in Verbindug mit Methoden Pointer einsetze, dann wissen die meis überhaupt nix über die andere Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502555</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 03 May 2008 12:12:35 GMT</pubDate></item></channel></rss>