<?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 Methoden einer unbekannten Klasse]]></title><description><![CDATA[<p>Hy<br />
Ich brauch eine Klasse in der ich in einem Vector o.ä. Zeiger auf Methoden und auf ein Objekt einer unbekannten Klasse speichern kann und diese dann auch abrufen. Mein Ansatz war :</p>
<pre><code class="language-cpp">template&lt;class Class&gt;
void Add(Class* Object, (void)(Class::*Callback)(void) );
</code></pre>
<p>Dann könnte ich die &quot;Add&quot; Funktion in der Theory etwa so benutzen :</p>
<pre><code class="language-cpp">&lt;MyClass&gt;Add(*MyObject, &amp;(MyObject::MyMethod));
</code></pre>
<p>Wobei &quot;MyMethod&quot; weder Parameter noch einen Rückgabetyp haben darf.</p>
<p>Aber so gehts nicht, gibt 23 Fehler von Fatal error C1004: Underwartetes Dateiende, bis error c2988: Unerkannte Vorlagendeklaration/-definiotn ist da alles dabei.</p>
<p>Ich hoffe ihr könnt mir Helfen.<br />
MfG Nusso</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/251458/zeiger-auf-methoden-einer-unbekannten-klasse</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 11:50:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/251458.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Oct 2009 15:50:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger auf Methoden einer unbekannten Klasse on Mon, 05 Oct 2009 15:50:08 GMT]]></title><description><![CDATA[<p>Hy<br />
Ich brauch eine Klasse in der ich in einem Vector o.ä. Zeiger auf Methoden und auf ein Objekt einer unbekannten Klasse speichern kann und diese dann auch abrufen. Mein Ansatz war :</p>
<pre><code class="language-cpp">template&lt;class Class&gt;
void Add(Class* Object, (void)(Class::*Callback)(void) );
</code></pre>
<p>Dann könnte ich die &quot;Add&quot; Funktion in der Theory etwa so benutzen :</p>
<pre><code class="language-cpp">&lt;MyClass&gt;Add(*MyObject, &amp;(MyObject::MyMethod));
</code></pre>
<p>Wobei &quot;MyMethod&quot; weder Parameter noch einen Rückgabetyp haben darf.</p>
<p>Aber so gehts nicht, gibt 23 Fehler von Fatal error C1004: Underwartetes Dateiende, bis error c2988: Unerkannte Vorlagendeklaration/-definiotn ist da alles dabei.</p>
<p>Ich hoffe ihr könnt mir Helfen.<br />
MfG Nusso</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788355</guid><dc:creator><![CDATA[Nusso]]></dc:creator><pubDate>Mon, 05 Oct 2009 15:50:08 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden einer unbekannten Klasse on Mon, 05 Oct 2009 16:00:47 GMT]]></title><description><![CDATA[<p>Nusso schrieb:</p>
<blockquote>
<p>Dann könnte ich die &quot;Add&quot; Funktion in der Theory etwa so benutzen :</p>
<pre><code class="language-cpp">&lt;MyClass&gt;Add(*MyObject, &amp;(MyObject::MyMethod));
</code></pre>
</blockquote>
<p>Definitiv nicht, Templates haben eine andere Syntax. <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="😉"
    /><br />
Ausserdem scheint mir, zur Funktionssignatur würde eher ein Adress- als ein Dereferenzierungsoperator passen.</p>
<p>Du solltest dich ein wenig in die Materie einlesen, bevor du wild rumprobierst. <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="🙂"
    /><br />
Hier eine Möglichkeit. Denk aber dran, dass die Funktionssignatur hier exakt stimmen muss, also inklusive <code>const</code> -Qualifizierung.</p>
<pre><code class="language-cpp">class MyClass
{
	public:
		void Function()
		{
			// ...
		}
};

template &lt;typename Class&gt;
void DoSomething(Class&amp; Object, void (Class::*MemFunc)())
{
	(Object.*MemFunc)();
}

int main()
{
	MyClass a;
	DoSomething(a, &amp;MyClass::Function);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1788359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788359</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 05 Oct 2009 16:00:47 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden einer unbekannten Klasse on Mon, 05 Oct 2009 16:13:55 GMT]]></title><description><![CDATA[<p>Nimm einfach boost::function.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788369</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 05 Oct 2009 16:13:55 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden einer unbekannten Klasse on Mon, 05 Oct 2009 20:50:41 GMT]]></title><description><![CDATA[<p>Eigentlich hab ich mich in die Materie, tut mir leid das mit der Benutzung in der Theory war Falsch, thx für die Verbesserung,<br />
aber back to topic, kannst du mir bitte nochmal genau den unterschied zwischen deiner Funktionsdeklaration erklären und meiner erklären ich seh da keinen Unterschied, ausser dass du &quot;typename&quot; schreibst und ich &quot;class&quot; was aber ja auch keinen Unterschied mach^^.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788455</guid><dc:creator><![CDATA[Nusso]]></dc:creator><pubDate>Mon, 05 Oct 2009 20:50:41 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden einer unbekannten Klasse on Mon, 05 Oct 2009 20:51:43 GMT]]></title><description><![CDATA[<p>Sry für den Doppelpost, hab aber jetzt auf die schnelle keinen Edit Button gefunded :</p>
<p>Danke dir für deine schnelle und vor allem Funktionierende Antwort<br />
MfG Nusso</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788457</guid><dc:creator><![CDATA[Nusso]]></dc:creator><pubDate>Mon, 05 Oct 2009 20:51:43 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden einer unbekannten Klasse on Mon, 05 Oct 2009 21:29:53 GMT]]></title><description><![CDATA[<p>Nusso schrieb:</p>
<blockquote>
<p>aber back to topic, kannst du mir bitte nochmal genau den unterschied zwischen deiner Funktionsdeklaration erklären und meiner erklären ich seh da keinen Unterschied, ausser dass du &quot;typename&quot; schreibst und ich &quot;class&quot; was aber ja auch keinen Unterschied mach^^.</p>
</blockquote>
<p>Das Problem ist nicht die Funktionsdeklaration, sondern der Aufruf. Und eine Definition mit konkreter Callback-Implementierung hättest du dir so oder so auch überlegen müssen.</p>
<pre><code class="language-cpp">&lt;MyClass&gt;Add(*MyObject, &amp;(MyObject::MyMethod));
</code></pre>
<p>Templates, 1. Lektion: Template-Argumente werden in spitzen Klammern <strong>nach</strong> dem Bezeichner der Klasse oder der Funktion kommagetrennt aufgelistet. Bei Funktionstemplates können die Templateargumente oft aus den Funktionsargumenten hergeleitet werden und müssen daher nicht mehr explizit hingeschrieben werden. In meinem Beispiel habe ich dies ausgenutzt; es kann die Übersicht stark fördern.</p>
<p>Zeiger, 2. Lektion: Um die Adresse eines Objekts zu erhalten, kann man den Adressoperator &amp; einsetzen. Mittels Dereferenzierungsoperator * spricht man das Objekt an, auf das ein Zeiger zeigt.</p>
<p>Alles klar? <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/1788465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788465</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 05 Oct 2009 21:29:53 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden einer unbekannten Klasse on Tue, 06 Oct 2009 13:52:56 GMT]]></title><description><![CDATA[<p>ja danke,<br />
aber das habe ich gar nicht gemeint, ich habe in meinem Code<br />
die Funktion gar nicht aufgerufen, sonder hab sie nur deklariert<br />
und es gab trotzdem die ganzen Fehler ..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788720</guid><dc:creator><![CDATA[Nusso]]></dc:creator><pubDate>Tue, 06 Oct 2009 13:52:56 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden einer unbekannten Klasse on Tue, 06 Oct 2009 14:11:35 GMT]]></title><description><![CDATA[<p>Wozu ist so eine Funktion gut?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788740</guid><dc:creator><![CDATA[wie jetzt]]></dc:creator><pubDate>Tue, 06 Oct 2009 14:11:35 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Methoden einer unbekannten Klasse on Tue, 06 Oct 2009 15:35:37 GMT]]></title><description><![CDATA[<p>Nusso schrieb:</p>
<blockquote>
<p>ja danke,<br />
aber das habe ich gar nicht gemeint, ich habe in meinem Code<br />
die Funktion gar nicht aufgerufen, sonder hab sie nur deklariert<br />
und es gab trotzdem die ganzen Fehler ..</p>
</blockquote>
<p>ich vermute dass die klammern um das erste &quot;void&quot; hier: <code>(void)(Class::*Callback)(void)</code> das problem waren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788782</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 06 Oct 2009 15:35:37 GMT</pubDate></item></channel></rss>