<?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[Funktion pointer auf member-Funktionen]]></title><description><![CDATA[<p>Hi,</p>
<p>ich weiss das dieses Problem schon oft in Foren besprochen worde, trotzdem komm ich mit diesem einfachen Code Beispiel schon nicht klar.</p>
<p>Hier ist der alte lauffähige Code den ich ersetzen möchte:</p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

class foo{
public :
    foo(int sel){ selection = sel; };

    int selection;
    void one(){ cout &lt;&lt; &quot;one&quot; &lt;&lt; endl; }
    void two(){ cout &lt;&lt; &quot;two&quot; &lt;&lt; endl; }

    void one_or_two(){
        if (selection == 1)
            one();
        else
            two();
    }
};

/*
 * 
 */
int main(int argc, char** argv) {

    foo f(1);
    f.one_or_two();
    return (EXIT_SUCCESS);
}
</code></pre>
<p>Und hier ist der neue Code den ich nicht kompliert bekomme:</p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

class foo{
public :
    foo(int sel){
        selection = sel;
        if (selection == 1)
            one_or_two = one;
        else
            one_or_two = two;
    };

    int selection;
    void one(){ cout &lt;&lt; &quot;one&quot; &lt;&lt; endl; }
    void two(){ cout &lt;&lt; &quot;two&quot; &lt;&lt; endl; }

    void (*one_or_two)();
};

/*
 *
 */
int main(int argc, char** argv) {

    foo f(1);
    f.one_or_two();
    return (EXIT_SUCCESS);
}
</code></pre>
<p>error: argument of type `void (foo::)()' does not match `void (*)()'</p>
<p>Ich weiss das es daran liegt, dass ich einem normalen Funktions Pointer eine Member-Funktion zuweisen möchte. Und ich könnte das Problem lösen, indem ich stattdessen static Funktionen verwende. Aber für mein (reales) Code Problem, muss ich wirklich member funktionen verwenden.</p>
<p>Was muss ich am Code ändern damit es funktioniert?</p>
<p>Danke für die Zeit zu diesem alten Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264219/funktion-pointer-auf-member-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 23:09:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264219.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 04 Apr 2010 15:38:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktion pointer auf member-Funktionen on Sun, 04 Apr 2010 15:38:46 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich weiss das dieses Problem schon oft in Foren besprochen worde, trotzdem komm ich mit diesem einfachen Code Beispiel schon nicht klar.</p>
<p>Hier ist der alte lauffähige Code den ich ersetzen möchte:</p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

class foo{
public :
    foo(int sel){ selection = sel; };

    int selection;
    void one(){ cout &lt;&lt; &quot;one&quot; &lt;&lt; endl; }
    void two(){ cout &lt;&lt; &quot;two&quot; &lt;&lt; endl; }

    void one_or_two(){
        if (selection == 1)
            one();
        else
            two();
    }
};

/*
 * 
 */
int main(int argc, char** argv) {

    foo f(1);
    f.one_or_two();
    return (EXIT_SUCCESS);
}
</code></pre>
<p>Und hier ist der neue Code den ich nicht kompliert bekomme:</p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

class foo{
public :
    foo(int sel){
        selection = sel;
        if (selection == 1)
            one_or_two = one;
        else
            one_or_two = two;
    };

    int selection;
    void one(){ cout &lt;&lt; &quot;one&quot; &lt;&lt; endl; }
    void two(){ cout &lt;&lt; &quot;two&quot; &lt;&lt; endl; }

    void (*one_or_two)();
};

/*
 *
 */
int main(int argc, char** argv) {

    foo f(1);
    f.one_or_two();
    return (EXIT_SUCCESS);
}
</code></pre>
<p>error: argument of type `void (foo::)()' does not match `void (*)()'</p>
<p>Ich weiss das es daran liegt, dass ich einem normalen Funktions Pointer eine Member-Funktion zuweisen möchte. Und ich könnte das Problem lösen, indem ich stattdessen static Funktionen verwende. Aber für mein (reales) Code Problem, muss ich wirklich member funktionen verwenden.</p>
<p>Was muss ich am Code ändern damit es funktioniert?</p>
<p>Danke für die Zeit zu diesem alten Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877512</guid><dc:creator><![CDATA[tco]]></dc:creator><pubDate>Sun, 04 Apr 2010 15:38:46 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion pointer auf member-Funktionen on Sun, 04 Apr 2010 15:42:51 GMT]]></title><description><![CDATA[<p><a href="http://www.newty.de/fpt/index.html" rel="nofollow">http://www.newty.de/fpt/index.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877513</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 04 Apr 2010 15:42:51 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion pointer auf member-Funktionen on Sun, 04 Apr 2010 16:46:55 GMT]]></title><description><![CDATA[<p>Danke für den Guten Link. Habs jetzt wie folgt geändert und nun ein neues Problem.</p>
<p>Wie kann ich auf den &quot;Member-Function-pointer&quot; meiner Klasse, von aussen zugreifen?</p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

class foo{
public :
    foo(int sel){
        selection = sel;
        if (selection == 1)
            one_or_two = &amp;foo::one;
        else
            one_or_two = &amp;foo::two;
            // (this-&gt;*one_or_two)();
    };

    int selection;
    void one(){ cout &lt;&lt; &quot;one&quot; &lt;&lt; endl; }
    void two(){ cout &lt;&lt; &quot;two&quot; &lt;&lt; endl; }

    void (foo::*one_or_two)();
};

/*
 *
 */
int main(int argc, char** argv) {
    foo f(1);
    (f.*one_or_two)();
    return (EXIT_SUCCESS);
}

error: `one_or_two' was not declared in this scope
bei (f.*one_or_two)();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1877537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877537</guid><dc:creator><![CDATA[tco]]></dc:creator><pubDate>Sun, 04 Apr 2010 16:46:55 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion pointer auf member-Funktionen on Sun, 04 Apr 2010 16:50:54 GMT]]></title><description><![CDATA[<p>Was soll das überhaupt?</p>
<p>Ich würde das eher so machen:</p>
<pre><code class="language-cpp">typedef void (foo::*one_or_two)(); // typedef für einfachere Benutzung

int main(int argc, char** argv) {
    foo f(1);
    one_or_two fp = &amp;foo::one; // funktionszeiger erzeugen
    (f.*fp)(); // aufrufen
    return (EXIT_SUCCESS);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1877539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877539</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 04 Apr 2010 16:50:54 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion pointer auf member-Funktionen on Sun, 04 Apr 2010 16:57:13 GMT]]></title><description><![CDATA[<p>Also den member-function-pointer ausserhalb der Klasse deklarieren?</p>
<p>Das eigentliche Programm, das ich verändern möchte, ist natürlich ganz anders und viel Komplexer. Die Sache ist, abhängig von der Initialisierung der Klasse, soll eine bestimmte Member-Funktion der Klasse unterschiedliche Dinge tun. Der Benutzer soll davon aber gar nicht bemerken. Er soll, auf das Beispiel bezogen, immer nur one_or_two() aufrufen und braucht gar nichts von den echten Funktionen (one oder two) wissen.</p>
<p>Klar könnte ich wie im alten Code Beispiel, einfach eine IF-Verzweigung in One_or_two verwenden, aber da sich die Auswahl nach der Initalisierung niemals ändert, und die Funktion one_or_two mehrere tausende Male ausgeführt wird, wollte ich direkt einen Zeiger verwenden, der immer auf die entsprechende (reale Funktion one oder two) zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877544</guid><dc:creator><![CDATA[tco]]></dc:creator><pubDate>Sun, 04 Apr 2010 16:57:13 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion pointer auf member-Funktionen on Sun, 04 Apr 2010 17:24:08 GMT]]></title><description><![CDATA[<p>Wäre vielleicht das Strategy-Entwurfsmuster eine Alternative?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877555</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 04 Apr 2010 17:24:08 GMT</pubDate></item></channel></rss>