<?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[Pointer auf Funktion]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich habe folgendes Codefragment und eine Fehlermeldung dazu. Meine Fragen formuliere ich im Anschluss.</p>
<pre><code>class X {
public:
  void die();
protected:
  void (*pBreakCallFunction)();

...

}

X::X(){
  this-&gt;pBreakCallFunction = &amp;X::die;
}

void X::die(){
  // do something...
}
</code></pre>
<p>Fehlermeldung (manuell angepasst):</p>
<pre><code>X.cpp:12: Fehler: »void (X::*)()« kann nicht nach »void (*)()« in assignment umgewandelt werden
</code></pre>
<p>Variante 1: Ich habe bereits in Erfahrung gebracht / erfolgreich getestet, dass es mit einer entsprechenden Deklaration keine Meldung gibt:</p>
<pre><code>void (X::*pBreakCallFunction)();
</code></pre>
<p>Variante 2: Die andere Variante, die ich getestet hatte (alternativ) war, bei der Zuweisung einen Typecast durchzuführen - dies brachte (nur) eine Warnung:</p>
<pre><code>this-&gt;pBreakCallFunction = (void (*)())&amp;X::die;
</code></pre>
<p>Nun mein Problem:<br />
Mein Ziel ist eigentlich dem Nutzer von Klasse X die Entscheidung frei zu überlassen, wo die Funktion herkommt, die er (bspw. ueber eine weitere public-Funktion) in der Membervariable hinterlegt, solange sie void liefert und keine Parameter besitzt...</p>
<p>Mit Variante 1 dürfte ich dies nicht erreichen können (bspw. Funktionen anderer nicht von X erbender Klassen oder aus dem Hauptprogramm würden dies ja nicht erfüllen).<br />
Ob Variante 2 überhaupt bei einem kompilierten Programm funktioniert weiss ich Stand heute nicht mal.</p>
<p>Daher meine Fragen:<br />
Können bei Variante 1 erbende Klassen eigene Funktionen überhaupt dort hinterlegen?<br />
Wie stelle ich es richtig an, dass ich das volle Ziel erreiche?</p>
<p>Vielen Dank allen schon mal im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/254165/pointer-auf-funktion</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 02:00:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/254165.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 Nov 2009 14:53:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer auf Funktion on Thu, 12 Nov 2009 14:53:38 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich habe folgendes Codefragment und eine Fehlermeldung dazu. Meine Fragen formuliere ich im Anschluss.</p>
<pre><code>class X {
public:
  void die();
protected:
  void (*pBreakCallFunction)();

...

}

X::X(){
  this-&gt;pBreakCallFunction = &amp;X::die;
}

void X::die(){
  // do something...
}
</code></pre>
<p>Fehlermeldung (manuell angepasst):</p>
<pre><code>X.cpp:12: Fehler: »void (X::*)()« kann nicht nach »void (*)()« in assignment umgewandelt werden
</code></pre>
<p>Variante 1: Ich habe bereits in Erfahrung gebracht / erfolgreich getestet, dass es mit einer entsprechenden Deklaration keine Meldung gibt:</p>
<pre><code>void (X::*pBreakCallFunction)();
</code></pre>
<p>Variante 2: Die andere Variante, die ich getestet hatte (alternativ) war, bei der Zuweisung einen Typecast durchzuführen - dies brachte (nur) eine Warnung:</p>
<pre><code>this-&gt;pBreakCallFunction = (void (*)())&amp;X::die;
</code></pre>
<p>Nun mein Problem:<br />
Mein Ziel ist eigentlich dem Nutzer von Klasse X die Entscheidung frei zu überlassen, wo die Funktion herkommt, die er (bspw. ueber eine weitere public-Funktion) in der Membervariable hinterlegt, solange sie void liefert und keine Parameter besitzt...</p>
<p>Mit Variante 1 dürfte ich dies nicht erreichen können (bspw. Funktionen anderer nicht von X erbender Klassen oder aus dem Hauptprogramm würden dies ja nicht erfüllen).<br />
Ob Variante 2 überhaupt bei einem kompilierten Programm funktioniert weiss ich Stand heute nicht mal.</p>
<p>Daher meine Fragen:<br />
Können bei Variante 1 erbende Klassen eigene Funktionen überhaupt dort hinterlegen?<br />
Wie stelle ich es richtig an, dass ich das volle Ziel erreiche?</p>
<p>Vielen Dank allen schon mal im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1807036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1807036</guid><dc:creator><![CDATA[r*z*]]></dc:creator><pubDate>Thu, 12 Nov 2009 14:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Funktion on Thu, 12 Nov 2009 15:30:49 GMT]]></title><description><![CDATA[<p>Normale Funktionszeiger != Memberfunktionszeiger !!!<br />
Memberfunktionen benötigen ja ein konkretes Objekt.</p>
<p>Ansonsten sieh dir mal boost::function&lt;&gt; an...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1807071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1807071</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Thu, 12 Nov 2009 15:30:49 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Funktion on Thu, 12 Nov 2009 15:39:37 GMT]]></title><description><![CDATA[<p>Die ursprüngliche Deklaration des Funktions-Pointers ist die einer freien Funktion. Das Casten auf eine Member-Funktion funktioniert zwar, beim Aufruf dürfte es aber gemeine Sachen zu beobachten geben.</p>
<p>Die zweite Deklaration definiert dann einen Zeiger auf eine Member-Funktion von X. Den können auch Unterklassen mit einer eigenen Funktion setzen, die es in X selbst noch gar nicht gibt.</p>
<p>Natürlich musst du die Funktion, je nach verwendetem Pointer, auch passend aufrufen. Aber das sagt dir der Compiler dann schon.</p>
<p>Statt Variante 2 würde ich mir überlegen, ob es nicht auch eine rein virtuelle Funktion in Klasse X tut, die Unterklassen passend überschreiben müssen.</p>
<p>Falls du eine allgemeingültige Lösung wünscht, kommst du mEn um Templates nicht herum. Aus dem Handgelenk fällt mir etwa folgende Lösung ein (Achtung: nicht getestet!):</p>
<pre><code class="language-cpp">struct CallbackBase {

   virtual void call() = 0;
};

template &lt;typename Fn&gt;
struct Callback: public CallbackBase {

   Fn fn;

   explicit Callback(Fn f) : fn(f) {
   }

   virtual void call() {
      fn();
   }
};

class X {

public:
   template &lt;typename C&gt;
   void setCallback(C cb) {
      callback = std::auto_ptr&lt;CallbackBase&gt;(new Callback&lt;C&gt;(cb));
   }

private:
   std::auto_ptr&lt;CallbackBase&gt; callback;
};
</code></pre>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1807075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1807075</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Thu, 12 Nov 2009 15:39:37 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Funktion on Thu, 12 Nov 2009 19:42:45 GMT]]></title><description><![CDATA[<p>Ich verweise mal auf das berühmte Function Pointer Tutorial:</p>
<p><a href="http://www.newty.de/fpt/index.html" rel="nofollow">http://www.newty.de/fpt/index.html</a></p>
<p>Da steht sehr viel drin, was oft gebraucht wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1807220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1807220</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 12 Nov 2009 19:42:45 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Funktion on Fri, 13 Nov 2009 15:28:36 GMT]]></title><description><![CDATA[<p>Danke Euch allen!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/483">@Stefan</a> die Problematik die ich beschrieben habe, war leider nur eine weniger komplizierte Ausführung dessen, was wirkilch vor mir stand. Tatsächlich ist auch die Menge der Zeiger je Subklasse unterschiedlich, die auf solche Funktionen gesetzt werden sollen. Bei dem Beispiel gings mir eher um die prinzipielle Vorgehensweise einen Funktionszeiger zu belegen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>: Danke, die Doku hatte mich auf meinen Weg im Vorfeld gebracht <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="😃"
    /></p>
<p>Allgemein kann ich hiermit sagen, dass meine Variante 1 so weit mittlerweile erfolgreich auch bei Subklassen angewendet wurde. Auch wenn ich manuell an dieser Stelle auf (void (X::*)())&amp;XSub::fkt casten musste/muss.</p>
<p>Schönes Wochenende zusammen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1807591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1807591</guid><dc:creator><![CDATA[r*z*]]></dc:creator><pubDate>Fri, 13 Nov 2009 15:28:36 GMT</pubDate></item></channel></rss>