<?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[Zeiger auf Memberfunktion mit gleichen Rückgabetyp]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich würde gerne einen Zeiger auf eine Memberfunktion deklarieren,<br />
die genau so einen Zeiger auch wieder zurückliefert.</p>
<p>Ist das möglich?</p>
<p>So</p>
<pre><code class="language-cpp">class A {
public:
        typedef FncPtr (A::*FncPtr)();
}
</code></pre>
<p>oder so</p>
<pre><code class="language-cpp">class A {
public:
        typedef A::FncPtr (A::*FncPtr)();
}
</code></pre>
<p>klappt es leider nicht...</p>
<p>Da fehlt mir ja (vermutlich) eine Vorwärtsdeklaration für den Rückgabewert.</p>
<p>Wie mache ich dafür eine Forwärtsdeklaration?<br />
bzw.<br />
Wie krieg ich mein gewünschtes Verhalten hin?</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269860/zeiger-auf-memberfunktion-mit-gleichen-rückgabetyp</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 22:17:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269860.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 02 Jul 2010 09:28:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger auf Memberfunktion mit gleichen Rückgabetyp on Fri, 02 Jul 2010 09:28:14 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich würde gerne einen Zeiger auf eine Memberfunktion deklarieren,<br />
die genau so einen Zeiger auch wieder zurückliefert.</p>
<p>Ist das möglich?</p>
<p>So</p>
<pre><code class="language-cpp">class A {
public:
        typedef FncPtr (A::*FncPtr)();
}
</code></pre>
<p>oder so</p>
<pre><code class="language-cpp">class A {
public:
        typedef A::FncPtr (A::*FncPtr)();
}
</code></pre>
<p>klappt es leider nicht...</p>
<p>Da fehlt mir ja (vermutlich) eine Vorwärtsdeklaration für den Rückgabewert.</p>
<p>Wie mache ich dafür eine Forwärtsdeklaration?<br />
bzw.<br />
Wie krieg ich mein gewünschtes Verhalten hin?</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920321</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 09:28:14 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Memberfunktion mit gleichen Rückgabetyp on Fri, 02 Jul 2010 10:25:35 GMT]]></title><description><![CDATA[<p>Warum auch immer du das vorhast, so klappts:</p>
<p>A.h:</p>
<pre><code class="language-cpp">#ifndef A_H
    #define A_H

    #include &lt;iostream&gt;

    class A;

    typedef void (A::*fPtr)();

    typedef fPtr (A::*fPtr_returns_fPtr)();

    class A
    {
        public:
            void foo() { std::cout &lt;&lt; &quot;Hello&quot;; }

            fPtr bar() { return &amp;A::foo; }
    };
#endif
</code></pre>
<p>Aufruf:</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;

int main()
{
    A a;

    fPtr_returns_fPtr foobar = &amp;A::bar;

    fPtr f = (a.*foobar)();

    (a.*f)(); // ruft a.foo() auf
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1920347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920347</guid><dc:creator><![CDATA[Max0r]]></dc:creator><pubDate>Fri, 02 Jul 2010 10:25:35 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Memberfunktion mit gleichen Rückgabetyp on Fri, 02 Jul 2010 11:43:59 GMT]]></title><description><![CDATA[<p>Max0r schrieb:</p>
<blockquote>
<pre><code class="language-cpp">typedef void (A::*fPtr)();

    typedef fPtr (A::*fPtr_returns_fPtr)();
</code></pre>
</blockquote>
<p>Ja nee...</p>
<p>Wie man sowas generell macht, ist mir klar, jedoch soll der Rückgabetyp<br />
von fPtr_returns_fPtr ebenfalls fPtr_returns_fPtr sein.</p>
<p>Danke dir trotzdem Max0r!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920393</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 11:43:59 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Memberfunktion mit gleichen Rückgabetyp on Fri, 02 Jul 2010 11:53:07 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Wie man sowas generell macht, ist mir klar, jedoch soll der Rückgabetyp<br />
von fPtr_returns_fPtr ebenfalls fPtr_returns_fPtr sein.</p>
</blockquote>
<p>Du läufst hier in eine unendliche Reihe von Rückgaben. Wo soll diese aufhören? Wenn du diese Frage nicht beantworten kannst, dann hast du einen Fehler in deinem Design.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920401</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 02 Jul 2010 11:53:07 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Memberfunktion mit gleichen Rückgabetyp on Fri, 02 Jul 2010 13:09:00 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>CSpille schrieb:</p>
<blockquote>
<p>Wie man sowas generell macht, ist mir klar, jedoch soll der Rückgabetyp<br />
von fPtr_returns_fPtr ebenfalls fPtr_returns_fPtr sein.</p>
</blockquote>
<p>Du läufst hier in eine unendliche Reihe von Rückgaben. Wo soll diese aufhören? Wenn du diese Frage nicht beantworten kannst, dann hast du einen Fehler in deinem Design.</p>
</blockquote>
<p>Versteh ich nicht...<br />
Klar kann man (theoretisch) eine unendliche Kette kreieren.</p>
<p>Nach deiner Argumentation würde sowas dann ja (glaub ich) auch nicht gehen:</p>
<pre><code class="language-cpp">class A{
public:
	A* getA();

};
</code></pre>
<p>Da hast du dann ja auch eine (potentiell) unendliche Kette..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920459</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 13:09:00 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Memberfunktion mit gleichen Rückgabetyp on Fri, 02 Jul 2010 13:51:32 GMT]]></title><description><![CDATA[<p>Naja...</p>
<p>Vielleicht ist dieses Beispiel besser:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

template&lt;typename T&gt;
void print(T* t){
        while(t!=NULL){
                std::cout &lt;&lt; t-&gt;getValue() &lt;&lt; std::endl;
                t = t-&gt;getNeighbour();
        }
}

template&lt;typename ElementType&gt;
class NeighbourInfo{
public:
        typedef ElementType element_type;
        NeighbourInfo(NeighbourInfo&lt;element_type&gt;* n, int value) : neighbour(n), value(value){
        }

        NeighbourInfo&lt;element_type&gt;* getNeighbour(){
                return neighbour;
        }

        int getValue(){
                return value;
        }

private:
        NeighbourInfo&lt;element_type&gt;* neighbour;
        int value;

};

int main()
{
        NeighbourInfo&lt;int&gt; n1(0,0);
        NeighbourInfo&lt;int&gt; n2(&amp;n1,1);
        NeighbourInfo&lt;int&gt; n3(&amp;n2,2);
        NeighbourInfo&lt;int&gt; n4(&amp;n3,3);
        NeighbourInfo&lt;int&gt; n5(&amp;n4,4);
        NeighbourInfo&lt;int&gt; n6(&amp;n5,5);
        print(&amp;n6);
        return 0;
}
</code></pre>
<p>Hier wird ja auch eine Kette von Neighbour&lt;int&gt; ineinandergeschachtelt, die<br />
(theoretisch) unendlich werden kann...</p>
<p>EDIT:</p>
<p>Alternativ rekursiv:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void print(T* t){
        std::cout &lt;&lt; t-&gt;getValue() &lt;&lt; std::endl;
        print(t-&gt;getNeighbour());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1920469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920469</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 13:51:32 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Memberfunktion mit gleichen Rückgabetyp on Fri, 02 Jul 2010 14:07:17 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Da hast du dann ja auch eine (potentiell) unendliche Kette..</p>
</blockquote>
<p>Nein, das ist nur beliebig lang, aber trotzdem immer endlich. Bei dem was du vorhast willst du eine Funktion haben, die einen Zeiger auf eine Funktion zurückgibt, die einen Zeiger auf eine Funktion zurückgibt, die einen Zeiger auf eine Funktion zurückgibt, die...</p>
<p>das ist unendlich, weils tatsächlich kein Ende gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920473</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 02 Jul 2010 14:07:17 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Memberfunktion mit gleichen Rückgabetyp on Fri, 02 Jul 2010 14:28:23 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>CSpille schrieb:</p>
<blockquote>
<p>Da hast du dann ja auch eine (potentiell) unendliche Kette..</p>
</blockquote>
<p>Nein, das ist nur beliebig lang, aber trotzdem immer endlich. Bei dem was du vorhast willst du eine Funktion haben, die einen Zeiger auf eine Funktion zurückgibt, die einen Zeiger auf eine Funktion zurückgibt, die einen Zeiger auf eine Funktion zurückgibt, die...</p>
<p>das ist unendlich, weils tatsächlich kein Ende gibt.</p>
</blockquote>
<p>Ich glaub ich bin etwas schwer von Begriff ^^</p>
<p>Ich hab das Beispiel etwas abgewandelt, jetzt ist die Kette (der Ring) doch auch<br />
unendlich, oder?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

template&lt;typename T&gt;
void print(T* t, int depth){
        if(depth&gt;0){
                std::cout &lt;&lt; t-&gt;getValue() &lt;&lt; std::endl;
                print(t-&gt;getNeighbour(),--depth);
        }
}

template&lt;typename ElementType&gt;
class NeighbourInfo{
public:
        typedef ElementType element_type;
        NeighbourInfo(NeighbourInfo&lt;element_type&gt;* n, int value) : neighbour(n), value(value){
        }

        void setNeighbour(NeighbourInfo&lt;element_type&gt;* n){
                neighbour = n;
        }

        NeighbourInfo&lt;element_type&gt;* getNeighbour(){
                return neighbour;
        }

        int getValue(){
                return value;
        }

private:
        NeighbourInfo&lt;element_type&gt;* neighbour;
        int value;

};

int main()
{
        NeighbourInfo&lt;int&gt; n1(0,0);
        NeighbourInfo&lt;int&gt; n2(&amp;n1,1);
        n1.setNeighbour(&amp;n2);
        print(&amp;n1, 1000);
        return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1920492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920492</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 14:28:23 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Memberfunktion mit gleichen Rückgabetyp on Fri, 02 Jul 2010 14:49:56 GMT]]></title><description><![CDATA[<p>Viel interessanter wäre doch die Frage, warum du glaubst, sowas benötigen zu müssen. <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/1920502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920502</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 02 Jul 2010 14:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Memberfunktion mit gleichen Rückgabetyp on Fri, 02 Jul 2010 15:21:56 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Viel interessanter wäre doch die Frage, warum du glaubst, sowas benötigen zu müssen. <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>Als ich diesen Beitrag gelesen habe, mußte ich erstmal schmunzeln <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>also...</p>
<p>Es war natürlich arg vereinfacht. In Wirklichkeit möchte ich etwas<br />
erzeugen wie:</p>
<pre><code class="language-cpp">std::vector&lt;std::pair&lt;Info, FncPtr&gt;&gt; (A::*FncPtr)(/*Params*/);
</code></pre>
<p>Der Rückgabewert ist eine Liste mit Paaren Information und wo geht's weiter<br />
Der Benutzer kriegt dann an eine Funktion alle Möglichkeiten (Rückgabe dieser Funktion)<br />
übergeben und soll anhand der Info entscheiden, was er machen möchte.<br />
Die Funktion gibt dann das entsprechende std::pair (oder nur Funktion-Pointer) zurück.</p>
<p>Anhand der Auswahl des Benutzers und der damit verknüpften Funktion<br />
werden dann die weiteren Verlaufsmöglichkeiten kreiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920520</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 15:21:56 GMT</pubDate></item></channel></rss>