<?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 Klassenmethoden (Ableitung)]]></title><description><![CDATA[<p>Huhu,<br />
ich habe ein kleines Problem mit Pointern auf Klassenmethoden.<br />
Gegeben sei folgende Klasse:</p>
<pre><code>class BaseClass{
public:
	BaseClass();
	virtual ~BaseClass();

    ...
    int func1(char, int);
	void takeFunc(int (BaseClass::*func)(char, int));
};
</code></pre>
<p>Der Methode takeFunc(..) kann ich einen Zeiger auf eine beliebige andere Klassenmethode übergeben (solang diese die entsprechende Signatur besitzt).<br />
Mein Problem ist nun das takeFunc(..) nun wirklich nur Pointer von der Klasse BaseClass annimmt. Wenn ich nun von BaseClass ableite und eine Methode mit entsprechender Signatur definiere kann ich diese nicht an takeFunc übergeben.</p>
<pre><code>class DerivedClass: public BaseClass {
public:
	DerivedClass();
	virtual ~DerivedClass();
	int func2(char, int);
};

..

DerivedClass dc;
dc.takeFunc(&amp;DerivedClass::func1); // Ok
dc.takeFunc(&amp;DerivedClass::func2); // Fehler
</code></pre>
<p>Ich hätte gerne das takeFunc auch Zeiger auf Methoden von beliegen abgeleiteten Klassen aufnehmen kann.<br />
Hab ich irgendwas verpeilt oder gibt es einen Trick wie ich das machen kann? Oder muss ich mir irgendwie anders helfen?</p>
<p>mfg xorm <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/topic/225401/zeiger-auf-klassenmethoden-ableitung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 09:29:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/225401.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Oct 2008 21:39:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger auf Klassenmethoden (Ableitung) on Wed, 22 Oct 2008 21:45:56 GMT]]></title><description><![CDATA[<p>Huhu,<br />
ich habe ein kleines Problem mit Pointern auf Klassenmethoden.<br />
Gegeben sei folgende Klasse:</p>
<pre><code>class BaseClass{
public:
	BaseClass();
	virtual ~BaseClass();

    ...
    int func1(char, int);
	void takeFunc(int (BaseClass::*func)(char, int));
};
</code></pre>
<p>Der Methode takeFunc(..) kann ich einen Zeiger auf eine beliebige andere Klassenmethode übergeben (solang diese die entsprechende Signatur besitzt).<br />
Mein Problem ist nun das takeFunc(..) nun wirklich nur Pointer von der Klasse BaseClass annimmt. Wenn ich nun von BaseClass ableite und eine Methode mit entsprechender Signatur definiere kann ich diese nicht an takeFunc übergeben.</p>
<pre><code>class DerivedClass: public BaseClass {
public:
	DerivedClass();
	virtual ~DerivedClass();
	int func2(char, int);
};

..

DerivedClass dc;
dc.takeFunc(&amp;DerivedClass::func1); // Ok
dc.takeFunc(&amp;DerivedClass::func2); // Fehler
</code></pre>
<p>Ich hätte gerne das takeFunc auch Zeiger auf Methoden von beliegen abgeleiteten Klassen aufnehmen kann.<br />
Hab ich irgendwas verpeilt oder gibt es einen Trick wie ich das machen kann? Oder muss ich mir irgendwie anders helfen?</p>
<p>mfg xorm <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/1603107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1603107</guid><dc:creator><![CDATA[xorm]]></dc:creator><pubDate>Wed, 22 Oct 2008 21:45:56 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Klassenmethoden (Ableitung) on Wed, 22 Oct 2008 21:47:02 GMT]]></title><description><![CDATA[<p>mir fallen nur templates ein:</p>
<pre><code class="language-cpp">class BaseClass{
public:
    ...
    int func1(char, int);
    template &lt;class T&gt;
    void takeFunc(int (T::*func)(char, int));
};
</code></pre>
<p>Rest wie gehabt. Evtl. einen STATIC_ASSERT mechanismus einbauen der garantiert, dass T von BaseClass abgeleitet ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1603109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1603109</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 22 Oct 2008 21:47:02 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Klassenmethoden (Ableitung) on Wed, 22 Oct 2008 21:47:45 GMT]]></title><description><![CDATA[<p>Nunja, verwunderlich ist das ja eigentlich nicht. Schließlich ist func2 ja keine Methode von BaseClass <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="😉"
    /> Kennst du boost::bind? Es lohnt sich wirklich, damit ein wenig herumzuspielen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1603110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1603110</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 22 Oct 2008 21:47:45 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Klassenmethoden (Ableitung) on Thu, 23 Oct 2008 07:43:16 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Rest wie gehabt. Evtl. einen STATIC_ASSERT mechanismus einbauen der garantiert, dass T von BaseClass abgeleitet ist...</p>
</blockquote>
<p>Wie soll dieser STATIC_ASSERT denn aussehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1603203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1603203</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 23 Oct 2008 07:43:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Klassenmethoden (Ableitung) on Thu, 23 Oct 2008 08:14:58 GMT]]></title><description><![CDATA[<p>Aus <em>modern C++</em> (bzw. der Loki-Bibliothek):</p>
<pre><code class="language-cpp">template &lt;bool&gt; struct CompileTimeChecker
{ CompileTimeChecker(...); };
template &lt;&gt; struct CompileTimeChecker&lt;false&gt; {};

#define STATIC_CHECK(expr, msg) \
  { \
    class ERROR_##msg {}; \
    (void)sizeof(CompileTimeChecker&lt; (expr) != 0 &gt;((ERROR_##msg())); \
  }
</code></pre>
<p>Dann noch der Check auf Vererbung:</p>
<pre><code class="language-cpp">template &lt;class T, class U&gt;
class Conversion
{
  typedef char Small;
  struct Big {char dummy[2]; };
  static Small Test(U);
  static Big Test(...);
  static T MakeT();
public:
  enum { sameType = false,
         exists = sizeof(Test(MakeT())) == sizeof(Small) };
};

template &lt;class T&gt; class Conversion&lt;T,T&gt;
{ public: enum { exists = true, sameType = true }; };

#define SUPERSUBCLASS(T, U) \
  (Conversion&lt;const U* const T*&gt;::exists &amp;&amp; \
  !Conversion&lt;const T*, const void*&gt;::sameType)
</code></pre>
<p>benutzt wirds dann wie folgt:</p>
<pre><code class="language-cpp">//...
template&lt;class T&gt;
void BaseClass::takeFunc(int (T::*func)(char, int))
{
  STATIC_CHECK(SUPERSUBCLASS(BaseClass,T),
       Template_Param_Must_Inherit_BaseClass);
  /*...*/
}
</code></pre>
<p>das gibt dann eine Compilerwarnung á la<br />
&quot;Error: Cannot convert ERROR_Template_Param_Must_Inherit_BaseClass to CompileTimeChecker&lt;false&gt;&quot;, wenn T nicht von BaseClass abgeleitet ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1603224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1603224</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 23 Oct 2008 08:14:58 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Klassenmethoden (Ableitung) on Thu, 23 Oct 2008 08:17:54 GMT]]></title><description><![CDATA[<p>Hmm, das CHECK_... kompiliert bei mir nicht. Weder mit gcc noch mit VC9.</p>
<p>Edit: sizeof ist in dem Kontext nicht zulässig, so sagt der Kompiler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1603229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1603229</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 23 Oct 2008 08:17:54 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Klassenmethoden (Ableitung) on Thu, 23 Oct 2008 16:43:40 GMT]]></title><description><![CDATA[<p>Danke für die Hinweise, werd ich mir mal näher angucken <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/1603535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1603535</guid><dc:creator><![CDATA[xorm]]></dc:creator><pubDate>Thu, 23 Oct 2008 16:43:40 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Klassenmethoden (Ableitung) on Thu, 23 Oct 2008 22:41:29 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">BOOST_STATIC_ASSERT( is_base_of&lt; Base, Derived &gt;::value );
// oder
BOOST_MPL_ASSERT(( is_base_of&lt; Base, Derived &gt; ));
</code></pre>
<p>z.B.</p>
<pre><code class="language-cpp">class BaseClass{
public:

    ...
    void takeFunc(int (BaseClass::*func)(char, int));
    template &lt;typename T&gt;
    void takeFunc(int (T::*func)(char, int))
    {
        BOOST_MPL_ASSERT_MSG(( (is_base_of&lt; BaseClass, T &gt;), MEMBER_FUNCTION_OF_BaseClass_OR_DERIVED_REQUIRED, (int (T::*)(char, int)) ));
        BOOST_MPL_ASSERT_MSG(( (is_convertible&lt; int (BaseClass::*)(char, int), (int (T::*)(char, int)) &gt;), BaseClass_IS_AMBIGOUS_OR_INACCESSIBLE_OR_VIRTUAL_BASE, (T) ));
        takeFunc( static_cast&lt; int (BaseClass::*)(char, int) &gt;( func ) );
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1603725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1603725</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 23 Oct 2008 22:41:29 GMT</pubDate></item></channel></rss>