<?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[funktionspointer einer nicht-statischen memberfunction nicht erlaubt?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem bei der Verheiratung meines objektorientierten Frontends mit der C-API im Backend meines Projekts.</p>
<p>Und zwar brauche ich einen Funktionspointer der dafür zuständig ist, einen Wert an die C-API zu übertragen. Dummerweise ist dieser Wert aber eine Instanzvariable und ihr getter nicht statisch, was zu Problemen führt.</p>
<p>Also mal ein Codebeispiel damit man versteht was ich meine:</p>
<p>Die C-API erwartet einen Funktionspointer auf eine Funktion die einen void* übernimmt und einen int zurückgibt, was als GetDatai_f getypedeft ist:</p>
<pre><code class="language-cpp">typedef int (* GetDatai_f)(void * inRefcon);
</code></pre>
<p>und diesen muss man registrieren, quasi wie ein Callback, durch Aufruf von RegisterDataAccessor die wie folgt deklariert ist:</p>
<pre><code class="language-cpp">void* RegisterDataAccessor(const char * inDataName, GetDatai_f inReadInt);
</code></pre>
<p>So, jetzt hat meine Klasse, wie es sich gehört für ihre Membervariablen getter:</p>
<pre><code class="language-cpp">class Data {
    public:
        void setupAPI();
        int getValue(void*) { return m_value; }
    private:
        int m_value;
}:
</code></pre>
<p>Und jetzt kommt der casus knacksus:</p>
<pre><code class="language-cpp">void Data::setupAPI()
{
    RegisterDataAcessor(&quot;value&quot;,getValue);
}
</code></pre>
<p>Was partout nicht funktionieren will:</p>
<pre><code>error: argument of type 'int (Data::)(void*)' does not match 'int (*)(void*)'
</code></pre>
<p>Ich kann rumcasten wie ich will, es geht nicht.</p>
<p>Oder wenn ich den Adressoperator davor mache</p>
<pre><code class="language-cpp">void Data::setupAPI()
{
    RegisterDataAcessor(&quot;value&quot;,&amp;getValue);
}
</code></pre>
<p>dann</p>
<pre><code>error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say '&amp;Data::setupAPI'
error: cannot convert 'int (Data::*)(void*)' to 'int (*)(void*)'
</code></pre>
<p>Also was tun? Ich muss an eine private membervariable ran und der getter ist mitnichten statisch, aber ich brauch einen pointer in der geforderten Form.<br />
Ich bin hier echt am verzweifeln, denn dieses ganze void* C-geraffel ist mir als OO-Fuzzi nicht meine Welt...</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/230614/funktionspointer-einer-nicht-statischen-memberfunction-nicht-erlaubt</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 04:01:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/230614.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Dec 2008 19:48:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to funktionspointer einer nicht-statischen memberfunction nicht erlaubt? on Mon, 29 Dec 2008 19:48:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem bei der Verheiratung meines objektorientierten Frontends mit der C-API im Backend meines Projekts.</p>
<p>Und zwar brauche ich einen Funktionspointer der dafür zuständig ist, einen Wert an die C-API zu übertragen. Dummerweise ist dieser Wert aber eine Instanzvariable und ihr getter nicht statisch, was zu Problemen führt.</p>
<p>Also mal ein Codebeispiel damit man versteht was ich meine:</p>
<p>Die C-API erwartet einen Funktionspointer auf eine Funktion die einen void* übernimmt und einen int zurückgibt, was als GetDatai_f getypedeft ist:</p>
<pre><code class="language-cpp">typedef int (* GetDatai_f)(void * inRefcon);
</code></pre>
<p>und diesen muss man registrieren, quasi wie ein Callback, durch Aufruf von RegisterDataAccessor die wie folgt deklariert ist:</p>
<pre><code class="language-cpp">void* RegisterDataAccessor(const char * inDataName, GetDatai_f inReadInt);
</code></pre>
<p>So, jetzt hat meine Klasse, wie es sich gehört für ihre Membervariablen getter:</p>
<pre><code class="language-cpp">class Data {
    public:
        void setupAPI();
        int getValue(void*) { return m_value; }
    private:
        int m_value;
}:
</code></pre>
<p>Und jetzt kommt der casus knacksus:</p>
<pre><code class="language-cpp">void Data::setupAPI()
{
    RegisterDataAcessor(&quot;value&quot;,getValue);
}
</code></pre>
<p>Was partout nicht funktionieren will:</p>
<pre><code>error: argument of type 'int (Data::)(void*)' does not match 'int (*)(void*)'
</code></pre>
<p>Ich kann rumcasten wie ich will, es geht nicht.</p>
<p>Oder wenn ich den Adressoperator davor mache</p>
<pre><code class="language-cpp">void Data::setupAPI()
{
    RegisterDataAcessor(&quot;value&quot;,&amp;getValue);
}
</code></pre>
<p>dann</p>
<pre><code>error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say '&amp;Data::setupAPI'
error: cannot convert 'int (Data::*)(void*)' to 'int (*)(void*)'
</code></pre>
<p>Also was tun? Ich muss an eine private membervariable ran und der getter ist mitnichten statisch, aber ich brauch einen pointer in der geforderten Form.<br />
Ich bin hier echt am verzweifeln, denn dieses ganze void* C-geraffel ist mir als OO-Fuzzi nicht meine Welt...</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637001</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 29 Dec 2008 19:48:38 GMT</pubDate></item><item><title><![CDATA[Reply to funktionspointer einer nicht-statischen memberfunction nicht erlaubt? on Mon, 29 Dec 2008 21:43:21 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p><a href="http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.2" rel="nofollow">http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.2</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637064</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 29 Dec 2008 21:43:21 GMT</pubDate></item><item><title><![CDATA[Reply to funktionspointer einer nicht-statischen memberfunction nicht erlaubt? on Mon, 29 Dec 2008 22:42:30 GMT]]></title><description><![CDATA[<p><a href="http://parashift.com" rel="nofollow">parashift.com</a> schrieb:</p>
<blockquote>
<p>How do I pass a pointer-to-member-function to a signal handler?<br />
Don't.</p>
</blockquote>
<p>Klasse. So eine Antwort hatte ich befürchtet... Jetzt fang ich doch wieder an die RefCon-Pointer runterzucasten und auf den daraus hervorgehenden Objekten rumzumachen. Genau das, was ich vermeiden wollte.</p>
<p>Man könnte ja sowas Schönes wie Referenzen, Funktoren oder boost::Function nehmen, aber nein, es ist das Jahr 2008 (!) und die Version 2.0 dieser API wird releast und sie verwenden WIEDER diese void-pointer-Scheiße!!! Ich könnt kotzen!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637079</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 29 Dec 2008 22:42:30 GMT</pubDate></item><item><title><![CDATA[Reply to funktionspointer einer nicht-statischen memberfunction nicht erlaubt? on Mon, 29 Dec 2008 23:09:05 GMT]]></title><description><![CDATA[<p>Ich verstehe deine Wut zwar, aber grundsätzlich ist das ja ein wenig ein anderes Konzept. Normale Funktionspointer und Memberfunktionspointer.<br />
Memberfunktionspointer sind Objektgebunden und die normalen halt nicht. Da bringt auch wildes rumgecasten nichts. Das Konzept ist dasselbe und kann gar nicht funktionieren, wenn du es mischen willst. Die API möchte eine Funktion aufrufen und die kannst du ihr geben (halt eine statische Funktion). Und wenn du ein Objekt damit verbinden willst, dann musst du das halt selber machen. (über den Parameter).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637089</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 29 Dec 2008 23:09:05 GMT</pubDate></item><item><title><![CDATA[Reply to funktionspointer einer nicht-statischen memberfunction nicht erlaubt? on Mon, 29 Dec 2008 23:13:10 GMT]]></title><description><![CDATA[<p>Bei C-APIs gehts halt nicht anders. Wenigstens kannst du einen void-Pointer übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637090</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 29 Dec 2008 23:13:10 GMT</pubDate></item><item><title><![CDATA[Reply to funktionspointer einer nicht-statischen memberfunction nicht erlaubt? on Mon, 29 Dec 2008 23:31:08 GMT]]></title><description><![CDATA[<p>So jetzt geht's. &quot;Dank&quot; der Referenzmitführung mit dem void*...<br />
Dieses Codestück müsste man echt mal sehen: mitten in Objektorientierung mit allen Finessen und Template-Spezialisierungen steht dann auf einmal so ein static_cast auf einen void*...<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Bin ich froh, dass dieser Teil des Projektes closed-source ist und sich diese Scheiße niemand angucken muss. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>: wütend bin ich auf diese API, nicht auf den C++-Standard. Dass pointer-to-member-function fundamental anders sind als normale funktionspointer ist ja einzusehen und hat seinen Sinn... Ich hatte nur insgeheim gehofft es gäbe einen anderen workaround.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637095</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 29 Dec 2008 23:31:08 GMT</pubDate></item></channel></rss>