<?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[Funktionszeiger casten]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Memberfunktion die als Argument einen Funktionszeiger benötigt.</p>
<p>Test::caller(void (*name)())</p>
<p>Die entsprechende Funktion, die Ausgeführt werden soll<br />
habe ich allerdings in einer Klasse definiert, ist also<br />
eine Memberfunktion</p>
<p>void (MyClass:: *name)()</p>
<p>ist es möglich die Memberfunktion als Argument zu übergeben ?</p>
<p>Wie muss ich das bitte casten ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/251116/funktionszeiger-casten</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 14:31:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/251116.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Sep 2009 13:47:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionszeiger casten on Tue, 29 Sep 2009 13:47:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Memberfunktion die als Argument einen Funktionszeiger benötigt.</p>
<p>Test::caller(void (*name)())</p>
<p>Die entsprechende Funktion, die Ausgeführt werden soll<br />
habe ich allerdings in einer Klasse definiert, ist also<br />
eine Memberfunktion</p>
<p>void (MyClass:: *name)()</p>
<p>ist es möglich die Memberfunktion als Argument zu übergeben ?</p>
<p>Wie muss ich das bitte casten ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1785962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1785962</guid><dc:creator><![CDATA[MBreuer]]></dc:creator><pubDate>Tue, 29 Sep 2009 13:47:38 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Tue, 29 Sep 2009 13:54:26 GMT]]></title><description><![CDATA[<p>MBreuer schrieb:</p>
<blockquote>
<p>ist es möglich die Memberfunktion als Argument zu übergeben ?</p>
</blockquote>
<p>nein, die Memberfunktion müsste statisch sein. Für welches Objekt sollte die Memberfunktion überhaupt aufgerufen werden und woher soll Test::caller das wissen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1785966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1785966</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 29 Sep 2009 13:54:26 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Tue, 29 Sep 2009 13:59:52 GMT]]></title><description><![CDATA[<p>OK im Grunde muss ich genauer fragen</p>
<p>ich möchte ein Objekt von MyClass haben<br />
und anschliessend für dieses Objekt den Funktionszeiger übergeben.</p>
<p>MyClass param;<br />
...</p>
<p>Test::caller(param.funktion)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1785972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1785972</guid><dc:creator><![CDATA[MBreuer]]></dc:creator><pubDate>Tue, 29 Sep 2009 13:59:52 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Tue, 29 Sep 2009 14:57:13 GMT]]></title><description><![CDATA[<p>Das mit den Zeigern auf Member-Funktionen geht so:</p>
<pre><code class="language-cpp">struct Test
{
	void function()
	{
	}
};

void caller(Test *test, void (Test::*func)())
{
	(test-&gt;*func)();
}

int main()
{
	Test t;
	caller(&amp;t, &amp;Test::function);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1786006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786006</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 29 Sep 2009 14:57:13 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Tue, 29 Sep 2009 15:48:16 GMT]]></title><description><![CDATA[<p>danke jetzt brauche ich das nur noch mit folgender Signatur:<br />
void caller(void (*func)()) ;</p>
<p>wobei ich void (Test::*func)() übergeben möchte</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786016</guid><dc:creator><![CDATA[MBreuer]]></dc:creator><pubDate>Tue, 29 Sep 2009 15:48:16 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Tue, 29 Sep 2009 16:20:56 GMT]]></title><description><![CDATA[<p>MBreuer schrieb:</p>
<blockquote>
<p>danke jetzt brauche ich das nur noch mit folgender Signatur:<br />
void caller(void (*func)()) ;</p>
</blockquote>
<p><code>void (*func)()</code> ist ein Zeiger auf eine <strong>freie</strong> Funktion mit 0 Parametern und Rückgabetyp <code>void</code> .</p>
<p>MBreuer schrieb:</p>
<blockquote>
<p>wobei ich void (Test::*func)() übergeben möchte</p>
</blockquote>
<p>Das hingegen ist eine <strong>Member</strong>funktion. Was willst du also? Inwiefern geht TyRoXx' Code nicht?</p>
<p>Vielleicht helfen dir auch die <a href="http://www.newty.de/fpt/index.html" rel="nofollow">Function Pointer Tutorials</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786083</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 29 Sep 2009 16:20:56 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Tue, 29 Sep 2009 16:21:34 GMT]]></title><description><![CDATA[<p>MBreuer schrieb:</p>
<blockquote>
<p>danke jetzt brauche ich das nur noch mit folgender Signatur:<br />
void caller(void (*func)()) ;</p>
<p>wobei ich void (Test::*func)() übergeben möchte</p>
</blockquote>
<p><code>void (*func)()</code> ist dafür unbrauchbar. Dieser Funktionszeiger <code>func</code> kann wirklich nur die Adresse einer freien oder statischen Funktion speichern und nichts weiteres, also auch nicht die Information, auf welchem Objekt eine Elementfunktion aufgerufen werden soll (der implizite <code>this</code> -Parameter).</p>
<p>Probier mal tr1::function oder <a href="http://www.boost.org/doc/libs/1_40_0/doc/html/function.html" rel="nofollow">Boost.Function</a>.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786084</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 29 Sep 2009 16:21:34 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Tue, 29 Sep 2009 18:34:02 GMT]]></title><description><![CDATA[<p>MBreuer schrieb:</p>
<blockquote>
<p>danke jetzt brauche ich das nur noch mit folgender Signatur:<br />
void caller(void (*func)()) ;</p>
<p>wobei ich void (Test::*func)() übergeben möchte</p>
</blockquote>
<p>das haben sich schon viele gedacht <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 />
geht bloss leider nicht. zumindest nicht portierbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786189</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 29 Sep 2009 18:34:02 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Wed, 30 Sep 2009 07:32:56 GMT]]></title><description><![CDATA[<p>Mir würde eine Lösung für VC++ 8.0 reichen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786319</guid><dc:creator><![CDATA[MBreuer]]></dc:creator><pubDate>Wed, 30 Sep 2009 07:32:56 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Wed, 30 Sep 2009 10:50:37 GMT]]></title><description><![CDATA[<p>MBreuer schrieb:</p>
<blockquote>
<p>Mir würde eine Lösung für VC++ 8.0 reichen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Woher soll ein void(<em>)() wissen, auf welchem Objekt eine Funktion aufgerufen werden soll? Die &quot;Adresse&quot; einer Elementfunktionen ist unabhängig von der Adresse des Objektes, auf dem sie aufgerufen werden soll. Alle Objekte teilen sich quasi dieselbe Elementfunktion und <code>this</code> ist ein versteckter zusätzlicher Parameter. Ein void(</em>)() speichert nur die Adresse einer Funktion, nichts anderes, also auch keinen this-Zeiger. Selbst wenn du wild reinterpret_cast benutzt, <strong>kann</strong> es so gar nicht funktionieren, wie Du es haben willst.</p>
<p>Siehe <a href="http://msdn.microsoft.com/de-de/library/bb982124(en-us).aspx" rel="nofollow">MSDN &lt;functional&gt; (TR1)</a>. Du kannst im Prinzip alles, was einen entsprechenden Funktions-Aufruf-Operator bietet, zu einem function&lt;&gt;-Objekt konvertieren, einschließlich &quot;normale&quot; Funktionszeiger und bind-Ergebnisse:</p>
<pre><code class="language-cpp">using std::tr1::function;
using std::tr1::bind;
using std::tr1::placeholders::_1;

void blah(function&lt;void(double)&gt; f)
{
  f(3.14159265);
}

class Klasse
{
  double faktor;
public:
  explicit Klasse(double f) : faktor(f) {}

  void mf(double b) const
  {
    std::cout &lt;&lt; faktor*b &lt;&lt; '\n';
  }
};

void bums(double b)
{
  std::cout &lt;&lt; b &lt;&lt; '\n';
}

int main()
{
  Klasse dings (2.7);
  blah( bind(&amp;Klasse::mf, dings,_1) ); // kopiert dings
  blah( bind(&amp;Klasse::mf,&amp;dings,_1) ); // speichert nur Zeiger auf dings
  blah( bums );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1786368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786368</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 30 Sep 2009 10:50:37 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Wed, 30 Sep 2009 09:38:56 GMT]]></title><description><![CDATA[<p>Das sieht gut aus, leider bekomme ich es nicht zum Laufen</p>
<pre><code class="language-cpp">// Test.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include &quot;stdafx.h&quot;
#include &lt;functional&gt;
using std::tr1::function;
using std::tr1::bind;

void blah(function&lt;void(double)&gt; f)
{
  f(3.14159265);
}

class Klasse
{
  double faktor;
public:
  explicit Klasse(double f) : faktor(f) {}

  void mf(double b) const
  {
    std::cout &lt;&lt; faktor*b &lt;&lt; '\n';
  }
};

void bums(double b)
{
  std::cout &lt;&lt; b &lt;&lt; '\n';
}

int _tmain(int argc, _TCHAR* argv[])
{
  Klasse dings (2.7);
  blah( bind(&amp;Klasse::mf, dings) ); // kopiert dings in das function&lt;&gt;-Objekt
  blah( bind(&amp;Klasse::mf,&amp;dings) ); // speichert nur Zeiger auf dings
  blah( bums );
	return 0;
}
</code></pre>
<p>gibt bei mir</p>
<blockquote>
<p>------ Erstellen gestartet: Projekt: Test, Konfiguration: Debug Win32 ------<br />
Kompilieren...<br />
Test.cpp<br />
f:\projekte\inova\spielwiese\test\test.cpp(6) : error C2039: 'function': Ist kein Element von 'std::tr1'<br />
f:\projekte\inova\spielwiese\test\test.cpp(6) : error C2873: 'function': Das Symbol kann nicht in einer using-Deklaration verwendet werden<br />
f:\projekte\inova\spielwiese\test\test.cpp(7) : error C2039: 'bind': Ist kein Element von 'std::tr1'<br />
f:\projekte\inova\spielwiese\test\test.cpp(7) : error C2873: 'bind': Das Symbol kann nicht in einer using-Deklaration verwendet werden<br />
f:\projekte\inova\spielwiese\test\test.cpp(9) : error C2065: 'function': nichtdeklarierter Bezeichner<br />
f:\projekte\inova\spielwiese\test\test.cpp(9) : error C2144: Syntaxfehler: 'double' sollte auf ')' folgen<br />
f:\projekte\inova\spielwiese\test\test.cpp(9) : error C2059: Syntaxfehler: ')'<br />
f:\projekte\inova\spielwiese\test\test.cpp(10) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'<br />
f:\projekte\inova\spielwiese\test\test.cpp(10) : error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?<br />
f:\projekte\inova\spielwiese\test\test.cpp(22) : error C2039: 'cout': Ist kein Element von 'std'<br />
f:\projekte\inova\spielwiese\test\test.cpp(22) : error C2065: 'cout': nichtdeklarierter Bezeichner<br />
f:\projekte\inova\spielwiese\test\test.cpp(28) : error C2039: 'cout': Ist kein Element von 'std'<br />
f:\projekte\inova\spielwiese\test\test.cpp(28) : error C2065: 'cout': nichtdeklarierter Bezeichner<br />
f:\projekte\inova\spielwiese\test\test.cpp(34) : error C3861: &quot;blah&quot;: Bezeichner wurde nicht gefunden.<br />
f:\projekte\inova\spielwiese\test\test.cpp(34) : error C3861: &quot;bind&quot;: Bezeichner wurde nicht gefunden.<br />
f:\projekte\inova\spielwiese\test\test.cpp(35) : error C3861: &quot;blah&quot;: Bezeichner wurde nicht gefunden.<br />
f:\projekte\inova\spielwiese\test\test.cpp(35) : error C3861: &quot;bind&quot;: Bezeichner wurde nicht gefunden.<br />
f:\projekte\inova\spielwiese\test\test.cpp(36) : error C3861: &quot;blah&quot;: Bezeichner wurde nicht gefunden.<br />
Das Buildprotokoll wurde unter &quot;file://f:\Projekte\Inova\Spielwiese\Test\Debug\BuildLog.htm&quot; gespeichert.<br />
Test - 18 Fehler, 0 Warnung(en)<br />
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========</p>
</blockquote>
<p>Welchen Header muss ich einbinden, was muss ich noch beachten.<br />
Danke für die Hinweise.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786381</guid><dc:creator><![CDATA[MBreuer]]></dc:creator><pubDate>Wed, 30 Sep 2009 09:38:56 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Wed, 30 Sep 2009 11:01:25 GMT]]></title><description><![CDATA[<p>MBreuer schrieb:</p>
<blockquote>
<p>Welchen Header muss ich einbinden</p>
</blockquote>
<p>Die Header, die std::tr1::function und std::tr1::bind definieren. Die Fehlermeldung besagt ja, dass dem Compiler nicht bewusst ist, dass es die zwei gibt. Außerdem muss die TR1-Bibliothek natürich überhaupt erstmal installiert sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786418</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 30 Sep 2009 11:01:25 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Wed, 30 Sep 2009 12:26:56 GMT]]></title><description><![CDATA[<p>über<br />
<a href="http://www.aristeia.com/EC3E/TR1_info.html" rel="nofollow">http://www.aristeia.com/EC3E/TR1_info.html</a></p>
<p>kam ich auf<br />
<a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=D466226B-8DAB-445F-A7B4-448B326C48E7&amp;displaylang=en" rel="nofollow">http://www.microsoft.com/downloads/details.aspx?FamilyId=D466226B-8DAB-445F-A7B4-448B326C48E7&amp;displaylang=en</a></p>
<p>und hab da ein wenig bedenken das zu installieren um den Code auszuprobieren.</p>
<p>Ich denke ich bleibe bei einem Workaround der aus meiner callback-Funktion<br />
über ein Singleton die entsprechenden Objektinformationen holt, die ich in der Callback-Funktion brauche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786472</guid><dc:creator><![CDATA[MBreuer]]></dc:creator><pubDate>Wed, 30 Sep 2009 12:26:56 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Wed, 30 Sep 2009 12:47:01 GMT]]></title><description><![CDATA[<p>MBreuer schrieb:</p>
<blockquote>
<p>Ich denke ich bleibe bei einem Workaround der aus meiner callback-Funktion<br />
über ein Singleton die entsprechenden Objektinformationen holt, die ich in der Callback-Funktion brauche.</p>
</blockquote>
<p>Eben, warum sauber, wenn es genau hässlich geht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786478</guid><dc:creator><![CDATA[Das ist top]]></dc:creator><pubDate>Wed, 30 Sep 2009 12:47:01 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Wed, 30 Sep 2009 13:15:30 GMT]]></title><description><![CDATA[<p>MBreuer schrieb:</p>
<blockquote>
<p>Ich denke ich bleibe bei einem Workaround der aus meiner callback-Funktion<br />
über ein Singleton die entsprechenden Objektinformationen holt, die ich in der Callback-Funktion brauche.</p>
</blockquote>
<p>Du könntest auch einfach mal mehr über das Problem erzählen, was Du lösen willst. Eventuell kann hier jemand eine andere elegante Lösung beisteuern.</p>
<p>Kannst auch <a href="http://www.parashift.com/c++-faq-lite/pointers-to-members.html" rel="nofollow">hier</a> gucken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786484</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 30 Sep 2009 13:15:30 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Wed, 30 Sep 2009 13:32:16 GMT]]></title><description><![CDATA[<p>Ich habe ein Objekt erstellt.<br />
Attribut filename=filename.xml</p>
<p>Der Funktionszeiger den ich übergeben will ist der Funktionszeiger einer<br />
Callback-Funktion.<br />
Die Lib ruft die Callback funtion auf.<br />
Jetzt hätte ich gern das diese Callback-Funktion die meines Objektes ist, d.h, der filename (filename.xml) verwendet wird.</p>
<p>Jetzt ist meine Lösung die das ich ein<br />
Singleton habe, dieses Singleton at ein Attribut meines Objektes.</p>
<p>Im Objekt habe ich eine Funktion die das Singleton nach diesem Objekt fragt und den Filenamen zurückgibt.</p>
<p>Das ganze geht nicht direkt über das Singleton, sondern ich habe noch ein Interface dazwischengeschaltet, so das ich später auch von anderen Stellen den Filenamen holen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786490</guid><dc:creator><![CDATA[MBreuer]]></dc:creator><pubDate>Wed, 30 Sep 2009 13:32:16 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Wed, 30 Sep 2009 13:46:02 GMT]]></title><description><![CDATA[<p>Und diese ominöse Bibliothek besitzt keinen void *user neben dem Callback? Falls das stimmt würde ich dringend die Bibliothek wechseln.<br />
Falls sie diese Möglichkeit bietet wäre folgendes eine Abhilfe:</p>
<pre><code>void cb_wrapper(void *user)
{
   DeineKlasse *obj = (DeineKlasse *)user;
   obj-&gt;*deine_funktion();
}
</code></pre>
<p>Falls du an der Bibliothek festhalten willst ginge auch folgendes:</p>
<pre><code>struct cb_wrapper
{
   static DeineKlasse *obj;
   void cb_func()
   {
       obj-&gt;*deine_funktion();
   }
};

//Aufruf:
cb_wrapper::obj = &amp;obj;
dumme_lib_cb_func(&amp;cb_wrapper::cb_func)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1786504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786504</guid><dc:creator><![CDATA[Tippgeber]]></dc:creator><pubDate>Wed, 30 Sep 2009 13:46:02 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Wed, 30 Sep 2009 14:17:19 GMT]]></title><description><![CDATA[<p>MBreuer schrieb:</p>
<blockquote>
<p>Ich habe ein Objekt erstellt.<br />
Attribut filename=filename.xml</p>
<p>Der Funktionszeiger den ich übergeben will ist der Funktionszeiger einer<br />
Callback-Funktion. Die Lib ruft die Callback funtion auf.</p>
</blockquote>
<p>Welche Lib? Deine Lib? Kannst Du da irgendwas an der Schnittstelle ändern? Was ist der genaue Typ des Funktionszeigers (Parameter, Rückgabewert, etc)?</p>
<p>MBreuer schrieb:</p>
<blockquote>
<p>Jetzt hätte ich gern das diese Callback-Funktion die meines Objektes ist, d.h, der filename (filename.xml) verwendet wird.</p>
<p>Jetzt ist meine Lösung die das ich ein<br />
Singleton habe, dieses Singleton at ein Attribut meines Objektes.</p>
<p>Im Objekt habe ich eine Funktion die das Singleton nach diesem Objekt fragt und den Filenamen zurückgibt.</p>
<p>Das ganze geht nicht direkt über das Singleton, sondern ich habe noch ein Interface dazwischengeschaltet, so das ich später auch von anderen Stellen den Filenamen holen kann.</p>
</blockquote>
<p>Klingt sehr kompliziert. Dann kannst Du ja auch gleich den Dateinamen als globale Variable anlegen und eine normale freie Funktion als Callback benutzen. Richtig toll ist das allerdings auch nicht.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786521</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 30 Sep 2009 14:17:19 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Wed, 30 Sep 2009 14:29:21 GMT]]></title><description><![CDATA[<p>ich hatte bisher auch schon 2-3 mal einen fall ohne &quot;void* userdata&quot;.</p>
<p>bleibt entweder singleton/globale variable (evtl. über mutex abgesichert, falls die callbacks nicht asynchron reinkommen -- und kommen sie doch asynchron, dann hilft nurmehr beten *g*).</p>
<p>oder aber das was z.B. auch die ATL macht: dynamisch thunks erzeugen. ist bloss leider ziemlich hässliche low-level frickelei. dafür ist es in der anwendung sehr flexibel und &quot;schön&quot;.</p>
<p>p.S.: ich hab' mich immer mit der &quot;globale variablen&quot; lösung zufrieden gegeben, da es in diesen fällen ausreichend war, und thunks erstellen ungleich mehr aufwand bedeutet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786522</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 30 Sep 2009 14:29:21 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger casten on Wed, 30 Sep 2009 14:53:33 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>p.S.: ich hab' mich immer mit der &quot;globale variablen&quot; lösung zufrieden gegeben, da es in diesen fällen ausreichend war, und thunks erstellen ungleich mehr aufwand bedeutet.</p>
</blockquote>
<p><strong>Falls</strong> er <strong>wirklich</strong> void(*)() braucht, könnte man es ja so machen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void foo_bloed( void (*pf)() )
{
  pf();
}

void foo_besser( void (*pf)(void*), void* ud )
{
  pf(ud);
}

template&lt; class C, void (C::*Pmf)() &gt;
struct wrapper {
  static C* pointer;
  static void func_global()
  { (pointer-&gt;*Pmf)(); }
  static void func_user(void* ud)
  { (reinterpret_cast&lt;C*&gt;(ud)-&gt;*Pmf)(); }
};

template&lt; class C, void (C::*Pmf)() &gt;
C* wrapper&lt;C,Pmf&gt;::pointer;

class Klasse {
public:
  void doit() { std::cout&lt;&lt;&quot;Hello!\n&quot;; }
};

int main()
{
  Klasse dings;
  typedef wrapper&lt;Klasse,&amp;Klasse::doit&gt; wt;
  wt::pointer = &amp;dings; // Globale Variable
  foo_bloed(&amp;wt::func_global);
  foo_besser(&amp;wt::func_user, &amp;dings);
}
</code></pre>
<p>Die &quot;globale&quot; Variante funktioniert natürlich nur solange sich Zugriffe auf die globalen Variablen nicht überschneiden. Immerhin bekommt jede Klassen/Elementfunktion-Kombination durch dieses Template einen eigenen Objekt-Zeiger.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786536</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 30 Sep 2009 14:53:33 GMT</pubDate></item></channel></rss>