<?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[Generische Pointer auf Methoden]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte eine Funktionalität wie die des Observer Patterns in C++ nachbauen, allerdings ohne Vererbung!!</p>
<p>Wenn ich Pointer auf Methoden verwenden würde, müsste ich doch die Klasse, auf die der Pointer zeigt, kennen.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">class B;

typedef int (B::*funptr) (int);
</code></pre>
<p>Ich schreibe eine Wiederverwendbare Klasse und kann heute nicht sagen, welche Klassen meine Klasse in 5 Jahren verwenden werden. Deshalb kann ich diese Variante nicht nehmen.</p>
<p>Ich möchte im wesentlichen eine Methode Subcribe anbieten, die einen generischen Methodenzeiger als Parameter erwartet. Benutzer meiner Klasse können sich über diese Methode bei meiner Klasse regristrieren. Wenn in meiner Klasse Informationen verfügbar sind, möchte ich diesen Methodenzeiger aufrufen, damit der jeweilige Benutzer weiß, dass Informationen vorhanden sind.</p>
<p>Hat jemand eine Idee wie ich es machen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/152930/generische-pointer-auf-methoden</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 04:31:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/152930.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Jul 2006 09:33:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Generische Pointer auf Methoden on Tue, 11 Jul 2006 09:33:15 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte eine Funktionalität wie die des Observer Patterns in C++ nachbauen, allerdings ohne Vererbung!!</p>
<p>Wenn ich Pointer auf Methoden verwenden würde, müsste ich doch die Klasse, auf die der Pointer zeigt, kennen.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">class B;

typedef int (B::*funptr) (int);
</code></pre>
<p>Ich schreibe eine Wiederverwendbare Klasse und kann heute nicht sagen, welche Klassen meine Klasse in 5 Jahren verwenden werden. Deshalb kann ich diese Variante nicht nehmen.</p>
<p>Ich möchte im wesentlichen eine Methode Subcribe anbieten, die einen generischen Methodenzeiger als Parameter erwartet. Benutzer meiner Klasse können sich über diese Methode bei meiner Klasse regristrieren. Wenn in meiner Klasse Informationen verfügbar sind, möchte ich diesen Methodenzeiger aufrufen, damit der jeweilige Benutzer weiß, dass Informationen vorhanden sind.</p>
<p>Hat jemand eine Idee wie ich es machen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1095635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095635</guid><dc:creator><![CDATA[Paddy82]]></dc:creator><pubDate>Tue, 11 Jul 2006 09:33:15 GMT</pubDate></item><item><title><![CDATA[Reply to Generische Pointer auf Methoden on Tue, 11 Jul 2006 09:36:35 GMT]]></title><description><![CDATA[<p>Paddy82 schrieb:</p>
<blockquote>
<p>Hat jemand eine Idee wie ich es machen könnte?</p>
</blockquote>
<p><a href="http://www.boost.org/libs/function/" rel="nofollow">boost.function</a> bietet dir alles was du dazu brauchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1095638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095638</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Tue, 11 Jul 2006 09:36:35 GMT</pubDate></item><item><title><![CDATA[Reply to Generische Pointer auf Methoden on Tue, 11 Jul 2006 10:30:12 GMT]]></title><description><![CDATA[<p>Wie genau würde das Aussehen?</p>
<p>Ich muss ja eine Subscribe Methode anbieten, bei der sich der Benutzer anmeldet. Als Parameter muss er mir einen Zeiger auf seine Notify-Methode übergeben.<br />
Wenn ich nun Daten empfange, rufe ich einfach seinen Pointer auf und er kann innerhalb seiner Notify-Methode die Daten bei mir abholen.</p>
<p>Die Benutzer-Klasse kann total unterschiedlich sein. Z.B. Heute gibt es eine Klasse X morgen eine Klasse Y und in 3 Jahren eine Klasse Z, die diese Subscribe Methode benutzen wollen.</p>
<p>In dem Tutorial von boost::function gibt es diese Variante:</p>
<pre><code class="language-cpp">struct X {
  int foo(int);
};

boost::function&lt;int (X*, int)&gt; f;

f = &amp;X::foo; &lt;-- Ausprägung

X x;
f(&amp;x, 5);
</code></pre>
<p>bekomme ich also als Paramter meiner Subcribe-Methode ein ausgeprägtes f (s.o.) übergeben und kann nun einfach f aufrufen?</p>
<p>Wie würde dann die Signatur meiner Subscribe-Methode aussehen?</p>
<pre><code class="language-cpp">void MyClass::Subscribe(boost::function&lt;????&gt;)
</code></pre>
<p>An dieser Stelle darf kein Klassenname stehen.</p>
<p>Bitte klär mich auf Hume</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1095676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095676</guid><dc:creator><![CDATA[Paddy82]]></dc:creator><pubDate>Tue, 11 Jul 2006 10:30:12 GMT</pubDate></item><item><title><![CDATA[Reply to Generische Pointer auf Methoden on Tue, 11 Jul 2006 10:35:21 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">boost::function1&lt;void, TypDesErstenParameters&gt; f;
f = boost::bind(&amp;Klasse::Memberfunction, ZeigerAufDieInstanz, _1);
f(parameter);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1095682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095682</guid><dc:creator><![CDATA[bind]]></dc:creator><pubDate>Tue, 11 Jul 2006 10:35:21 GMT</pubDate></item><item><title><![CDATA[Reply to Generische Pointer auf Methoden on Tue, 11 Jul 2006 10:42:02 GMT]]></title><description><![CDATA[<blockquote>
<pre><code class="language-cpp">boost::function1&lt;void, TypDesErstenParameters&gt; f;
f = boost::bind(&amp;Klasse::Memberfunction, ZeigerAufDieInstanz, _1);
f(parameter);
</code></pre>
</blockquote>
<p>aber wie du eben beschrieben hast,</p>
<pre><code class="language-cpp">boost::bind(&amp;Klasse::....
</code></pre>
<p>kann es nicht gehen, da ich &amp;Klasse nicht angeben kann, da ich gar nicht weiß, welche Klassen meine Klasse benutzen werden.</p>
<p>Ich glaub ich steh gerade auf der Leitung... <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="😞"
    /></p>
<p>Kann man nicht das &quot;fertige&quot; f (also nach dem bind) als parameter in meiner Methode übergeben? also z.B.</p>
<pre><code class="language-cpp">boost::function1&lt;void, TypDesErstenParameters&gt; f;
f = boost::bind(&amp;Klasse::Memberfunction, ZeigerAufDieInstanz, _1);

TestKlasse.Subscribe(f);
</code></pre>
<p>und in der Subscribe Methode:</p>
<pre><code class="language-cpp">f();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1095685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095685</guid><dc:creator><![CDATA[Paddy82]]></dc:creator><pubDate>Tue, 11 Jul 2006 10:42:02 GMT</pubDate></item><item><title><![CDATA[Reply to Generische Pointer auf Methoden on Tue, 11 Jul 2006 11:37:54 GMT]]></title><description><![CDATA[<p>Die Klasse muss man immer angeben, auch wenn man sich gerade in der selben Klasse befindet. Wenn du die Klasse umbemnenst musst du es an der Stelle auch ändern. Aber das stellt doch nicht wirklich ein Problem dar?!</p>
<p>Ja so sollte es gehen mit der Übergabe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1095711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095711</guid><dc:creator><![CDATA[bind]]></dc:creator><pubDate>Tue, 11 Jul 2006 11:37:54 GMT</pubDate></item><item><title><![CDATA[Reply to Generische Pointer auf Methoden on Tue, 11 Jul 2006 12:27:12 GMT]]></title><description><![CDATA[<p>Doch das stellt an der Stelle ein Problem dar, da ich heute nicht wissen kann, welche klassen mich irgendwann mal benutzen werden! Wenn der Benutzer selbst die Informationen über sich in die Boost::function füllt und sie dann in meine Klasse gibt, dann wird es funktionieren.</p>
<p>Noch mal zur Erläuterung:<br />
Benutzer:</p>
<pre><code class="language-cpp">class CBenutzer
{
   CBenutzer();
   void update();

   CServer myServer;
};

CBenutzer::CBenutzer()
{
    boost::function1&lt;void, void&gt; f;
    f = boost::bind(&amp;CBenutzer::update, this, _1);

    myServer.Subscribe(f);

}
</code></pre>
<p>Server:</p>
<pre><code class="language-cpp">CServer::Subscribe(????)
{
   store(f);
   if(gotData)
   {
      f();
   }
}
</code></pre>
<p>Was muss ich an der Stelle mit den Fragezeichen angeben, damit ich das Boost::Function Template übergeben kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1095749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095749</guid><dc:creator><![CDATA[Paddy82]]></dc:creator><pubDate>Tue, 11 Jul 2006 12:27:12 GMT</pubDate></item><item><title><![CDATA[Reply to Generische Pointer auf Methoden on Tue, 11 Jul 2006 12:33:11 GMT]]></title><description><![CDATA[<p>Ich könnte dein Problem ja verstehen wenn man dauernd bei Subscribe was ändern müsstest wenn eine neue Klasse benutzt werden soll. Aber dank boost::function ist das ja nicht so.</p>
<p>Für eine Funktion ohne Parameter nimmt man boost::function<strong>0</strong>.</p>
<p>Und Subscribe muss dann natürlich so aussehen:</p>
<pre><code class="language-cpp">CServer::Subscribe(const boost::function0&lt;void&gt;&amp; f)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1095752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095752</guid><dc:creator><![CDATA[bind]]></dc:creator><pubDate>Tue, 11 Jul 2006 12:33:11 GMT</pubDate></item><item><title><![CDATA[Reply to Generische Pointer auf Methoden on Tue, 11 Jul 2006 12:47:32 GMT]]></title><description><![CDATA[<p>Danke!!!</p>
<p>Genau das ist es doch, was ich die ganze Zeit von Dir hören wollte <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>Ich biete in meiner Klasse also eine Methode Subscribe mit der Signatur:</p>
<pre><code class="language-cpp">CServer::Subscribe(const boost::function0&lt;void&gt;&amp; f)
</code></pre>
<p>an.</p>
<p>Die Leute, die meine Subscribe- Methode benutzen wollen, müssen boost::function0 ausprägen und mir geben.</p>
<p>Wenn ich Daten für die Personen habe, rufe ich einfach deren boost::functions auf und sie wissen bescheid, dass sie sich ihre daten abholen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1095772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095772</guid><dc:creator><![CDATA[Paddy82]]></dc:creator><pubDate>Tue, 11 Jul 2006 12:47:32 GMT</pubDate></item><item><title><![CDATA[Reply to Generische Pointer auf Methoden on Tue, 11 Jul 2006 15:13:27 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/doc/html/signals/tutorial.html" rel="nofollow">http://www.boost.org/doc/html/signals/tutorial.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1095867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1095867</guid><dc:creator><![CDATA[ssm]]></dc:creator><pubDate>Tue, 11 Jul 2006 15:13:27 GMT</pubDate></item></channel></rss>