<?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[Methodenzeiger als Member für CallBack]]></title><description><![CDATA[<p>Hallo mal wieder,</p>
<p>ich versuche einfach gesagt die Events (TNotifyEvent) von Delphi in C++, resp. G++ nachzubilden.<br />
Es scheint dallerdings in C++ nicht so einfach zu sein.</p>
<p>Ein einfaches Beispiel wie ich mir das vorstellen würde:</p>
<p>class a {<br />
public<br />
void(*CallBack) ();<br />
void Call() {<br />
Callback(); // hier sollte jetzt die Prozedur b-&gt;Test() aufgerufen werden.<br />
}</p>
<p>class b {<br />
private<br />
void test();<br />
public:<br />
b(){<br />
m_a = new a();<br />
// hier wird es wild<br />
m_a-&gt;Callback = &amp;test;<br />
}</p>
<p>wie ich feststellen muss, geht das so nicht. Aus den Beschreibungen die im Inet<br />
bezülich Pointer auf Memberfunktionen kursieren, werde ich nicht ganz schlau.<br />
Gibt es überhaupt eine Möglichkeit für ein Konstrukt dieser Art unter C++?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/245670/methodenzeiger-als-member-für-callback</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 16:13:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/245670.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 17 Jul 2009 08:03:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Methodenzeiger als Member für CallBack on Fri, 17 Jul 2009 08:03:01 GMT]]></title><description><![CDATA[<p>Hallo mal wieder,</p>
<p>ich versuche einfach gesagt die Events (TNotifyEvent) von Delphi in C++, resp. G++ nachzubilden.<br />
Es scheint dallerdings in C++ nicht so einfach zu sein.</p>
<p>Ein einfaches Beispiel wie ich mir das vorstellen würde:</p>
<p>class a {<br />
public<br />
void(*CallBack) ();<br />
void Call() {<br />
Callback(); // hier sollte jetzt die Prozedur b-&gt;Test() aufgerufen werden.<br />
}</p>
<p>class b {<br />
private<br />
void test();<br />
public:<br />
b(){<br />
m_a = new a();<br />
// hier wird es wild<br />
m_a-&gt;Callback = &amp;test;<br />
}</p>
<p>wie ich feststellen muss, geht das so nicht. Aus den Beschreibungen die im Inet<br />
bezülich Pointer auf Memberfunktionen kursieren, werde ich nicht ganz schlau.<br />
Gibt es überhaupt eine Möglichkeit für ein Konstrukt dieser Art unter C++?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1744630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1744630</guid><dc:creator><![CDATA[Newbee2]]></dc:creator><pubDate>Fri, 17 Jul 2009 08:03:01 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger als Member für CallBack on Fri, 17 Jul 2009 08:10:43 GMT]]></title><description><![CDATA[<p>Nein; es gibt nur mehr oder weniger häßliche Workarounds dafür, z.B. <a href="http://www.codeproject.com/KB/cpp/FastDelegate.aspx" rel="nofollow">Fast Delegates</a> oder <a href="http://www.boost.org/doc/libs/1_39_0/doc/html/function/misc.html#id1878403" rel="nofollow">Boost.Function</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1744636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1744636</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Fri, 17 Jul 2009 08:10:43 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger als Member für CallBack on Fri, 17 Jul 2009 08:16:58 GMT]]></title><description><![CDATA[<p>Jop, das geht ganz gut.</p>
<pre><code class="language-cpp">typedef void (b::*callback)();
class a
{
  b* obj_;
  callback cb_;

  public:
   a ( b* obj, callback cb )
   : obj_ ( obj ),
   cb_ ( cb )
   {}

  void call ()
  {
    (obj-&gt;*cb)();
  }
};

class b
{
  public:
   void foo ()
   { std::cout &lt;&lt; &quot;hallo&quot;; }
}

int main ()
{
 b bar;
 a ( &amp;bar, &amp;b::foo );

 a-&gt;call();
}
</code></pre>
<p>Das einzige, was du da noch tun musst, ist das Objekt mitzugeben, da das auch benötigt wird.</p>
<p>Ansonsten musst du da halt noch was rund herum basteln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1744640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1744640</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 17 Jul 2009 08:16:58 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger als Member für CallBack on Fri, 17 Jul 2009 08:19:07 GMT]]></title><description><![CDATA[<p>Allerdings muss a hier alle Klassen kennen, die a benutzten wollen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /><br />
und ich müsste eine eigene CallBack für jeder dieser Klassen machen, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1744641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1744641</guid><dc:creator><![CDATA[Newbee2]]></dc:creator><pubDate>Fri, 17 Jul 2009 08:19:07 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger als Member für CallBack on Fri, 17 Jul 2009 08:20:43 GMT]]></title><description><![CDATA[<p>Newbee2 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class a {
public 
  void(*CallBack) ();
  void Call() {
    Callback(); // hier sollte jetzt die Prozedur b-&gt;Test() aufgerufen werden.
  }
};
</code></pre>
</blockquote>
<p>CallBack ist ein Zeiger auf eine freie Funktion. Soweit ich weiß gibt es in Delphi eine besodere Sorte Funktionszeiger, die nicht nur die Adresse der Funktion sondern auch die Adresse des Objektes speichert.</p>
<p>In C++ gibt es einen solchen &quot;Doppel-Zeiger&quot; nicht. Es gibt Zeiger auf Elementfunktionen. Diese binden aber nicht das Objekt:</p>
<pre><code class="language-cpp">a dings;
void (&amp;a::*pmf)() = &amp;a::Call; // pmf zeigt auf a::Call
(dings.*pmf)();               // Element-Funktion für Objekt dings aufrufen
</code></pre>
<p>C++ bietet einem aber die Möglichkeit, einen solchen generalisierten Funktionszeiger selbst zu bauen. Das wurde auch schon mehrfach gemacht. Such mal nach &quot;Boost.Function&quot; oder nach diversen &quot;signal/slots&quot;-Bibliotheken.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1744643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1744643</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Fri, 17 Jul 2009 08:20:43 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger als Member für CallBack on Fri, 17 Jul 2009 08:24:29 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void (&amp;a::*pmf)() = &amp;a::Call; // pmf zeigt auf a::Call
</code></pre>
</blockquote>
<p>Sorry, das &amp; in &amp;a::*pmf hat da nichts zu suchen und muss weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1744647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1744647</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Fri, 17 Jul 2009 08:24:29 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenzeiger als Member für CallBack on Fri, 17 Jul 2009 08:26:47 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void (&amp;a::*pmf)() = &amp;a::Call; // pmf zeigt auf a::Call
</code></pre>
</blockquote>
<p>Sorry, das &amp; in &amp;a::*pmf hat da nichts zu suchen und muss weg.</p>
</blockquote>
<p>Ich kenne da eine Möglichkeit, dass du so Sachen anderst beheben kannst.. <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>
<p>Tritt auf die dunkle Seite bei und unterstütze unsere Gemeinschaft mit dem Symbolischen Anmelden. :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1744651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1744651</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 17 Jul 2009 08:26:47 GMT</pubDate></item></channel></rss>