<?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[Callbackfunktion zwischen Klassen]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine Nicht-MFC-Klasse, die Daten an eine Callbackfunktion weiter<br />
gibt. Diese Callbackfunktion soll sich nun aber innerhalb einer MFC-Klasse<br />
befinden.<br />
Wenn ich es so versuche, bekomme ich einen Fehler:</p>
<pre><code class="language-cpp">void CClass1::Begin(void(*CBFunc)(String))
{
   [...]
   CBFunc(&quot;Hallo&quot;);
}

void CClass2::Begin(void)
{
   NonMFCObject-&gt;Begin(&amp;CMFCClass::Callback);
}

void CClass2::Callback(String strMessage)
{
   [...]
}
</code></pre>
<p>und zwar sagt mir der Compiler dann:<br />
error C2664: cannot convert parameter 1 from 'void (__thiscall CClass2::* )(String)' to 'void (__cdecl *)(String)'</p>
<p>Um das ganze Allgemein zu halten, kann ich in meiner CClass1 die Callbackfunktion aber nicht irgendwie so angeben:</p>
<pre><code class="language-cpp">void CClass1::Begin(void(*CClass2::Callback)(String))
</code></pre>
<p>sofern das überhaupt ginge...<br />
Weiß jemand Rat, oder muss ich meine Callbackfunktion jetzt definitiv als globale Funktion definieren und nicht innerhalb einer Klasse?</p>
<p>Norman.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/172329/callbackfunktion-zwischen-klassen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 19:48:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/172329.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 03 Feb 2007 22:35:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Callbackfunktion zwischen Klassen on Sat, 03 Feb 2007 22:35:49 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine Nicht-MFC-Klasse, die Daten an eine Callbackfunktion weiter<br />
gibt. Diese Callbackfunktion soll sich nun aber innerhalb einer MFC-Klasse<br />
befinden.<br />
Wenn ich es so versuche, bekomme ich einen Fehler:</p>
<pre><code class="language-cpp">void CClass1::Begin(void(*CBFunc)(String))
{
   [...]
   CBFunc(&quot;Hallo&quot;);
}

void CClass2::Begin(void)
{
   NonMFCObject-&gt;Begin(&amp;CMFCClass::Callback);
}

void CClass2::Callback(String strMessage)
{
   [...]
}
</code></pre>
<p>und zwar sagt mir der Compiler dann:<br />
error C2664: cannot convert parameter 1 from 'void (__thiscall CClass2::* )(String)' to 'void (__cdecl *)(String)'</p>
<p>Um das ganze Allgemein zu halten, kann ich in meiner CClass1 die Callbackfunktion aber nicht irgendwie so angeben:</p>
<pre><code class="language-cpp">void CClass1::Begin(void(*CClass2::Callback)(String))
</code></pre>
<p>sofern das überhaupt ginge...<br />
Weiß jemand Rat, oder muss ich meine Callbackfunktion jetzt definitiv als globale Funktion definieren und nicht innerhalb einer Klasse?</p>
<p>Norman.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1222463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1222463</guid><dc:creator><![CDATA[Norman0406]]></dc:creator><pubDate>Sat, 03 Feb 2007 22:35:49 GMT</pubDate></item><item><title><![CDATA[Reply to Callbackfunktion zwischen Klassen on Sun, 04 Feb 2007 04:11:33 GMT]]></title><description><![CDATA[<p>Hm.<br />
Mehrere Möglichkeiten...</p>
<p>1: gib der Callback Funktion ein void* Parameter.</p>
<pre><code class="language-cpp">class A
{
public:
    void Foo(void (*callback)(void*), void* param);
};

class B
{
public:
    void Bar();

    static void StaticBar(void* param)
    {
        static_cast&lt;B*&gt;(param)-&gt;Bar();
    }

    void Baz(A* a)
    {
        a-&gt;Foo(&amp;B::StaticBar, this);
    }
};
</code></pre>
<p>2: verwende eine &quot;Interface Klasse&quot;</p>
<pre><code class="language-cpp">class CallbackXYZ
{
public:
    virtual void Bar() = 0;
};

class A
{
public:
    void Foo(CallbackXYZ* callback);
};

class B : private CallbackXYZ
{
public:
    void Bar();
    void Baz(A* a)
    {
        a-&gt;Foo(this);
    }
};
</code></pre>
<p>3: verwende boost::function und boost::bind</p>
<pre><code class="language-cpp">class A
{
public:
    void Foo(boost::function&lt;void()&gt; const&amp; callback);
};

class B
{
public:
    void Bar();
    void Baz(A* a)
    {
        a-&gt;Foo(boost::bind(&amp;B::Bar, this));
    }
};
</code></pre>
<p>4: Strick dir selbst irgendwas mit Template-Magic</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1222513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1222513</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 04 Feb 2007 04:11:33 GMT</pubDate></item></channel></rss>