<?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[[Gelöst] Frage zur Übergabe von Funktionen als Parameter]]></title><description><![CDATA[<p>Im Buch &quot;Thinking in C++&quot; ist folgendes Beispiel gegeben:</p>
<pre><code class="language-cpp">template&lt;class Seq, class T, class R, class A&gt;
void apply(Seq&amp; sq, R(T::*f)(A), A a) {
	typename Seq::iterator it = sq.begin();
	while(it != sq.end()) {
		((*it)-&gt;*f)(a);
		it++;
	}
}

class Gromit {
	int arf;
public:
	Gromit(int arf = 1) : arf(arf + 1) {}
	void speak(int) {
		for(int i = 0; i &lt; arf; i++)
			std::cout &lt;&lt; &quot;arf! &quot;;
		std::cout &lt;&lt; std::endl;
	}
}

int main() {
	g(f);
	vector&lt;Gromit*&gt; dogs;
	for(int i = 0; i &lt; 5; i++)
		dogs.push_back(new Gromit(i));
	apply(dogs, &amp;Gromit::speak, 1);
}
</code></pre>
<p>Meine Frage ist nun, warum man einen Zeiger auf eine Funktion übergeben muss. Wenn man bei der apply-Definition die Sternchen vor f löscht und beim apply-Aufruf in der main() das &amp;-Zeichen weglässt, kompiliert das Programm nicht mehr. Im Allgemeinen kann man aber Funktion auch so übergeben (also ohne Zeiger). Warum ist das so?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306708/gelöst-frage-zur-übergabe-von-funktionen-als-parameter</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 10:05:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306708.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 05 Aug 2012 12:54:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Gelöst] Frage zur Übergabe von Funktionen als Parameter on Sun, 05 Aug 2012 18:06:17 GMT]]></title><description><![CDATA[<p>Im Buch &quot;Thinking in C++&quot; ist folgendes Beispiel gegeben:</p>
<pre><code class="language-cpp">template&lt;class Seq, class T, class R, class A&gt;
void apply(Seq&amp; sq, R(T::*f)(A), A a) {
	typename Seq::iterator it = sq.begin();
	while(it != sq.end()) {
		((*it)-&gt;*f)(a);
		it++;
	}
}

class Gromit {
	int arf;
public:
	Gromit(int arf = 1) : arf(arf + 1) {}
	void speak(int) {
		for(int i = 0; i &lt; arf; i++)
			std::cout &lt;&lt; &quot;arf! &quot;;
		std::cout &lt;&lt; std::endl;
	}
}

int main() {
	g(f);
	vector&lt;Gromit*&gt; dogs;
	for(int i = 0; i &lt; 5; i++)
		dogs.push_back(new Gromit(i));
	apply(dogs, &amp;Gromit::speak, 1);
}
</code></pre>
<p>Meine Frage ist nun, warum man einen Zeiger auf eine Funktion übergeben muss. Wenn man bei der apply-Definition die Sternchen vor f löscht und beim apply-Aufruf in der main() das &amp;-Zeichen weglässt, kompiliert das Programm nicht mehr. Im Allgemeinen kann man aber Funktion auch so übergeben (also ohne Zeiger). Warum ist das so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2238950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2238950</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sun, 05 Aug 2012 18:06:17 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Frage zur Übergabe von Funktionen als Parameter on Sun, 05 Aug 2012 13:08:23 GMT]]></title><description><![CDATA[<p>Gromit::speak ist kein gueltiger Ausdruck und R (T::) (A) kein gueltiger Typ.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2238953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2238953</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sun, 05 Aug 2012 13:08:23 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Frage zur Übergabe von Funktionen als Parameter on Sun, 05 Aug 2012 13:28:04 GMT]]></title><description><![CDATA[<p>::* ist ein einziger Operator, nicht etwa zwei Operatoren (:: und <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="😉"
    /> hintereinander. Lässt du den Stern weg, ändert sich die Bedeutung völlig.<br />
Ein Zeiger auf Member(-funktion) ist kein Zeiger.</p>
<p>Ramanujan schrieb:</p>
<blockquote>
<p>Im Allgemeinen kann man aber Funktion auch so übergeben (also ohne Zeiger).</p>
</blockquote>
<p>Wird bei einem Funktionsparameter ein Funktionstyp angegeben, wird diese Dekalartion automatisch vom Compiler umgewandelt in eine, die einen Zeiger deklariert ganz analog zu Arrayparametern, die in Zeiger-auf-Element umgewandelt werden.<br />
Es handelt sich hier also nur um eine syntaktische Vereinfachung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2238962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2238962</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 05 Aug 2012 13:28:04 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Frage zur Übergabe von Funktionen als Parameter on Sun, 05 Aug 2012 18:06:43 GMT]]></title><description><![CDATA[<p>Ok, thx.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239025</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sun, 05 Aug 2012 18:06:43 GMT</pubDate></item></channel></rss>