<?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 und ableiten :|]]></title><description><![CDATA[<p>Die Idee: mit jeder weiteren abgeleiteten Klasse kommen neue Methoden hinzu, die über Funktionspointer dann allgemein aufgerufen werden. Das Problem hierbei ist aber, dass ich in der Basisklasse ja schon angebe auf welche Klasse sich die Methode bezieht. Vielleicht weiß jemand Rat, wie man das elegant lösen kann?</p>
<p>Achja, ich verwende boost::function, wie man unschwer erkennen kann.</p>
<pre><code class="language-cpp">class A {
public:
    A()
    {
        registerCommand(0, &amp;A::onNewConnection);
        registerCommand(1, &amp;A::onAcceptConnection);
    }
    virtual ~A() {}

    void onReceive(int command, int interf)
    {
        methods[command](this, command, interf);
    }

private:
    virtual void registerCommand(int id, void (A::*method)(int, int))
    {
        methods[id] = method;
    }

    virtual void onNewConnection(int command, int interf)
    {
        std::cout &lt;&lt; &quot;NEWCONNECTION\n&quot;;
    }

    virtual void onAcceptConnection(int command, int interf)
    {
        std::cout &lt;&lt; &quot;ACCEPT: interf: &quot; &lt;&lt; interf &lt;&lt; std::endl;
    }

    typedef boost::function&lt;void (A*, int command, int interf)&gt; CommandMethod;
    std::map&lt;int, CommandMethod&gt; methods;
};

class B : public A {
public:
    B() 
    {
//        registerCommand(2, &amp;B::onWhatever);  &lt;-- das geht schief
    }
    virtual ~B() {}

private:
    virtual void onAcceptConnection(int command, int interf)
    {
        std::cout &lt;&lt; &quot;ACCEPT: interf: &quot; &lt;&lt; (interf + 3) &lt;&lt; std::endl;
    }

    virtual void onWhatever(int command, int interf)
    {
        std::cout &lt;&lt; &quot;whatever it takes&quot;;
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/155544/funktionspointer-und-ableiten</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 13:37:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/155544.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Aug 2006 11:40:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionspointer und ableiten :| on Mon, 07 Aug 2006 11:41:27 GMT]]></title><description><![CDATA[<p>Die Idee: mit jeder weiteren abgeleiteten Klasse kommen neue Methoden hinzu, die über Funktionspointer dann allgemein aufgerufen werden. Das Problem hierbei ist aber, dass ich in der Basisklasse ja schon angebe auf welche Klasse sich die Methode bezieht. Vielleicht weiß jemand Rat, wie man das elegant lösen kann?</p>
<p>Achja, ich verwende boost::function, wie man unschwer erkennen kann.</p>
<pre><code class="language-cpp">class A {
public:
    A()
    {
        registerCommand(0, &amp;A::onNewConnection);
        registerCommand(1, &amp;A::onAcceptConnection);
    }
    virtual ~A() {}

    void onReceive(int command, int interf)
    {
        methods[command](this, command, interf);
    }

private:
    virtual void registerCommand(int id, void (A::*method)(int, int))
    {
        methods[id] = method;
    }

    virtual void onNewConnection(int command, int interf)
    {
        std::cout &lt;&lt; &quot;NEWCONNECTION\n&quot;;
    }

    virtual void onAcceptConnection(int command, int interf)
    {
        std::cout &lt;&lt; &quot;ACCEPT: interf: &quot; &lt;&lt; interf &lt;&lt; std::endl;
    }

    typedef boost::function&lt;void (A*, int command, int interf)&gt; CommandMethod;
    std::map&lt;int, CommandMethod&gt; methods;
};

class B : public A {
public:
    B() 
    {
//        registerCommand(2, &amp;B::onWhatever);  &lt;-- das geht schief
    }
    virtual ~B() {}

private:
    virtual void onAcceptConnection(int command, int interf)
    {
        std::cout &lt;&lt; &quot;ACCEPT: interf: &quot; &lt;&lt; (interf + 3) &lt;&lt; std::endl;
    }

    virtual void onWhatever(int command, int interf)
    {
        std::cout &lt;&lt; &quot;whatever it takes&quot;;
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1112150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112150</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 07 Aug 2006 11:41:27 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer und ableiten :| on Mon, 07 Aug 2006 11:43:03 GMT]]></title><description><![CDATA[<p>Mach die Methoden protected und nicht virtuell.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112153</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Mon, 07 Aug 2006 11:43:03 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer und ableiten :| on Mon, 07 Aug 2006 11:47:54 GMT]]></title><description><![CDATA[<p>Das ändert nichts, dass ich in Bs Konstruktor die registerCommand-Methode aufrufen kann. Außerdem geht mir ja dadurch der Vorteil verloren die Methoden zu überladen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112156</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 07 Aug 2006 11:47:54 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer und ableiten :| on Mon, 07 Aug 2006 11:54:08 GMT]]></title><description><![CDATA[<p>Ich meinte registerCommand, die anderen habe ich mir nicht näher angeschaut. Diese Methode sollte nicht virtuell sein und muss auf jeden Fall protected sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112166</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Mon, 07 Aug 2006 11:54:08 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer und ableiten :| on Mon, 07 Aug 2006 11:59:47 GMT]]></title><description><![CDATA[<p>Er wird sich aber ewig beschweren, dass er B* nicht in A* konvertieren kann. Das Problem liegt ja scheinbar darin, dass sich die Methoden in der Map auf A beziehen und in Bs Konstruktor versucht wird eine Methode aus B dort reinzupacken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112174</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 07 Aug 2006 11:59:47 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer und ableiten :| on Mon, 07 Aug 2006 12:07:19 GMT]]></title><description><![CDATA[<p>Da hast du einen Designfehler. Wenn du einen A* Parameter hast, dann kannst du überhaupt nicht auf die neue Funktion zugreifen. Was spricht dagegen, &quot;echte&quot; Funktionen, von mir aus auch statische Member zu benutzen?</p>
<pre><code class="language-cpp">class A {
public:
    A()
    {
        registerCommand(0, &amp;A::onNewConnection);
        registerCommand(1, &amp;A::onAcceptConnection);
    }
    virtual ~A() {}

    void onReceive(int command, int interf)
    {
        methods[command](this, command, interf);
    }

private:
    void registerCommand(int id, void (*fun) (int, int))
    {
        methods[id] = method;
    }

    static void onNewConnection(int command, int interf)
    {
        std::cout &lt;&lt; &quot;NEWCONNECTION\n&quot;;
    }

    static void onAcceptConnection(int command, int interf)
    {
        std::cout &lt;&lt; &quot;ACCEPT: interf: &quot; &lt;&lt; interf &lt;&lt; std::endl;
    }

    typedef boost::function&lt;void (int command, int interf)&gt; CommandMethod;
    std::map&lt;int, CommandMethod&gt; methods;
};

class B : public A {
public:
    B() 
    {
        registerCommand(1, &amp;B::onAcceptConnection);
        registerCommand(2, &amp;B::onWhatever);  &lt;-- das geht schief
    }
    virtual ~B() {}

private:
    static void onAcceptConnection(int command, int interf)
    {
        std::cout &lt;&lt; &quot;ACCEPT: interf: &quot; &lt;&lt; (interf + 3) &lt;&lt; std::endl;
    }

    static void onWhatever(int command, int interf)
    {
        std::cout &lt;&lt; &quot;whatever it takes&quot;;
    }
};
</code></pre>
<p>So ists zwar nicht besonders elegant, aber es sollte funktionieren. Ich denk nochmal drüber nach <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112181</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Mon, 07 Aug 2006 12:07:19 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer und ableiten :| on Mon, 07 Aug 2006 12:20:35 GMT]]></title><description><![CDATA[<p>Ja der geht der Glanz verloren <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>
<p>Und irgendwie hab ich Probleme das jetzt zum Laufen zu bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112194</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 07 Aug 2006 12:20:35 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer und ableiten :| on Mon, 07 Aug 2006 14:09:31 GMT]]></title><description><![CDATA[<p>So, natürlich gibt es einen guten Grund, warum die Methoden nicht statisch sein sollten. In ihnen soll dann nämlich noch auf Variablen des Objektes zugegriffen werden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112289</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 07 Aug 2006 14:09:31 GMT</pubDate></item></channel></rss>