<?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 und Funktionen]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Frage zu folgendem Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A
{
private:
	int m_a, m_b;
public:
	void seta(int a) {m_a = a;}
	int geta() {return m_a;}
	void setb(int b) {m_b = b;}
	int getb() {return m_b;}

	typedef void (A::* func)(int); // ??

};

int main()
{

	A a;
	A::func f;

	f = &amp;A::seta;
	(a.*f)(3);	// Hier wird seta aufgerufen
	f = &amp;A::setb;
	(a.*f)(5);  // Hier wird setb aufgerufen

	cout &lt;&lt; a.geta() &lt;&lt; endl;
	cout &lt;&lt; a.getb() &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Wie man sieht werden zwei Methoden der Klasse A jeweils über den Zeiger f aufgerufen, nach dem ihm die Adressen der Methoden übergeben wurden. Soweit ist mir das klar. Mein Problem ist das typedef. Wie ist das gemeint? Mir ist schon klar dass das den typ func definiert, der auf eine Methode dieser Klasse zeigen kann, aber warum? Ich raff einfach nicht was</p>
<pre><code class="language-cpp">typedef void (A::* func)(int);
</code></pre>
<p>genau macht. Insbesondere das A::. Warum heißt es A:: und nicht A? Und warum steht der typname func in der Klammer und nicht hinter dem ganzen typedef?<br />
Wäre nett wenn mir das jemand erklären könnte...</p>
<p>Meine zweite Frage ist die folgende (hängt rerlativ eng mit der oberen zusammen):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void test()
{
	cout &lt;&lt; &quot;hallo&quot;;
}

int main()
{
	void* fp = &amp;test; // Adresse der FUnktion in Zeiger schreiben
	(*fp)(); // geht nicht
}
</code></pre>
<p>Wie kann ich die Funktion Test über den Zeiger aufrufen? So gehts jedenfalls nicht. Muss ich da zuerst noch casten oder so, wenn ja wie? Die genaue Fehlermeldung hab ich jetzt nicht vor mir, es war aber irgendwas wie &quot;Kein gültiger Funktionsaufruf&quot; oder so...</p>
<p>Vielen Dank für eure Mühe!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/160576/zeiger-und-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 08:06:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/160576.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Sep 2006 06:46:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger und Funktionen on Wed, 27 Sep 2006 06:46:31 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Frage zu folgendem Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A
{
private:
	int m_a, m_b;
public:
	void seta(int a) {m_a = a;}
	int geta() {return m_a;}
	void setb(int b) {m_b = b;}
	int getb() {return m_b;}

	typedef void (A::* func)(int); // ??

};

int main()
{

	A a;
	A::func f;

	f = &amp;A::seta;
	(a.*f)(3);	// Hier wird seta aufgerufen
	f = &amp;A::setb;
	(a.*f)(5);  // Hier wird setb aufgerufen

	cout &lt;&lt; a.geta() &lt;&lt; endl;
	cout &lt;&lt; a.getb() &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Wie man sieht werden zwei Methoden der Klasse A jeweils über den Zeiger f aufgerufen, nach dem ihm die Adressen der Methoden übergeben wurden. Soweit ist mir das klar. Mein Problem ist das typedef. Wie ist das gemeint? Mir ist schon klar dass das den typ func definiert, der auf eine Methode dieser Klasse zeigen kann, aber warum? Ich raff einfach nicht was</p>
<pre><code class="language-cpp">typedef void (A::* func)(int);
</code></pre>
<p>genau macht. Insbesondere das A::. Warum heißt es A:: und nicht A? Und warum steht der typname func in der Klammer und nicht hinter dem ganzen typedef?<br />
Wäre nett wenn mir das jemand erklären könnte...</p>
<p>Meine zweite Frage ist die folgende (hängt rerlativ eng mit der oberen zusammen):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void test()
{
	cout &lt;&lt; &quot;hallo&quot;;
}

int main()
{
	void* fp = &amp;test; // Adresse der FUnktion in Zeiger schreiben
	(*fp)(); // geht nicht
}
</code></pre>
<p>Wie kann ich die Funktion Test über den Zeiger aufrufen? So gehts jedenfalls nicht. Muss ich da zuerst noch casten oder so, wenn ja wie? Die genaue Fehlermeldung hab ich jetzt nicht vor mir, es war aber irgendwas wie &quot;Kein gültiger Funktionsaufruf&quot; oder so...</p>
<p>Vielen Dank für eure Mühe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1145221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1145221</guid><dc:creator><![CDATA[Patrick_R]]></dc:creator><pubDate>Wed, 27 Sep 2006 06:46:31 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Funktionen on Wed, 27 Sep 2006 07:01:43 GMT]]></title><description><![CDATA[<p>Hi!</p>
<blockquote>
<p>Wie man sieht werden zwei Methoden der Klasse A jeweils über den Zeiger f aufgerufen, nach dem ihm die Adressen der Methoden übergeben wurden. Soweit ist mir das klar. Mein Problem ist das typedef. Wie ist das gemeint? Mir ist schon klar dass das den typ func definiert, der auf eine Methode dieser Klasse zeigen kann, aber warum? Ich raff einfach nicht was</p>
</blockquote>
<p>Die Syntax für Funktionszeiger ist eben so:</p>
<pre><code class="language-cpp">typedef rückgabewert (zeigername)(parameterliste)
</code></pre>
<p>Das A::* steht für einen Zeiger auf eine Funktion der Klasse A.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1145228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1145228</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 27 Sep 2006 07:01:43 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Funktionen on Wed, 27 Sep 2006 07:25:53 GMT]]></title><description><![CDATA[<p>Ok, Danke dann ist das klar.<br />
Mich wunderts nur dass es nicht</p>
<pre><code class="language-cpp">typedef void (A* func)(int)
</code></pre>
<p>heißt.</p>
<p>Dann müsste ich bei meiner zweiten Frage schreiben:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void test()
{
    cout &lt;&lt; &quot;hallo&quot;;
}

int main()
{
    typedef void (*Fp)();
    Fp fp;
    fp = &amp;test;
    (*fp)(); 
}
</code></pre>
<p>kanns jetzt leider nicht ausprobieren</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1145241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1145241</guid><dc:creator><![CDATA[Patrick_R]]></dc:creator><pubDate>Wed, 27 Sep 2006 07:25:53 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Funktionen on Wed, 27 Sep 2006 07:45:30 GMT]]></title><description><![CDATA[<p>A* wäre ja ein Zeiger vom Typ A.<br />
A::* ist ein Zeiger auf eine Methode von A.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1145255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1145255</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Wed, 27 Sep 2006 07:45:30 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Funktionen on Wed, 27 Sep 2006 07:59:44 GMT]]></title><description><![CDATA[<blockquote>
<p>Dann müsste ich bei meiner zweiten Frage schreiben:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void test()
{
    cout &lt;&lt; &quot;hallo&quot;;
}

int main()
{
    typedef void (*Fp)();
    Fp fp;
    fp = &amp;test;
    (*fp)(); 
}
</code></pre>
<p>kanns jetzt leider nicht ausprobieren</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> Das richtig!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1145265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1145265</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 27 Sep 2006 07:59:44 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Funktionen on Wed, 27 Sep 2006 08:40:06 GMT]]></title><description><![CDATA[<p>Ok, vielen Dank jetzt ist mir das klar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1145270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1145270</guid><dc:creator><![CDATA[Patrick_R]]></dc:creator><pubDate>Wed, 27 Sep 2006 08:40:06 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Funktionen on Wed, 27 Sep 2006 10:08:07 GMT]]></title><description><![CDATA[<p>wo liegt nun der unterschied zu dem hier? (das geht auch)</p>
<pre><code class="language-cpp">typedef void(*fp)();
 fp FP;
 FP = test;
 FP();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1145297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1145297</guid><dc:creator><![CDATA[sadsds]]></dc:creator><pubDate>Wed, 27 Sep 2006 10:08:07 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Funktionen on Wed, 27 Sep 2006 12:23:12 GMT]]></title><description><![CDATA[<p>keine Ahnung, aber geh davon aus dass es einfach das gleiche bewirkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1145378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1145378</guid><dc:creator><![CDATA[Patrick_R]]></dc:creator><pubDate>Wed, 27 Sep 2006 12:23:12 GMT</pubDate></item></channel></rss>