<?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[Merkwürdiger Methodenaufruf - Parameter]]></title><description><![CDATA[<p>Hallo,</p>
<p>stöbere mich gerade durch einige c++ beispiele durch und dabei ist mir folgendes konstrukt aufgefallen, welches ich nicht verstehe:</p>
<pre><code class="language-cpp">void funcA(void (*intHandler) (int));
</code></pre>
<p>Was wird hier als Parameter genau erwartet??? Es sollte irgendwie eine Referenz auf eine Funktion übergeben werden. Ich verstehs einfach nicht. Vielleicht kann mir einer von Euch dies erklären?</p>
<p>Danke für Eure Unterstützung.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200106/merkwürdiger-methodenaufruf-parameter</link><generator>RSS for Node</generator><lastBuildDate>Sun, 04 Oct 2026 06:22:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200106.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 10 Dec 2007 19:27:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Merkwürdiger Methodenaufruf - Parameter on Mon, 10 Dec 2007 19:27:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>stöbere mich gerade durch einige c++ beispiele durch und dabei ist mir folgendes konstrukt aufgefallen, welches ich nicht verstehe:</p>
<pre><code class="language-cpp">void funcA(void (*intHandler) (int));
</code></pre>
<p>Was wird hier als Parameter genau erwartet??? Es sollte irgendwie eine Referenz auf eine Funktion übergeben werden. Ich verstehs einfach nicht. Vielleicht kann mir einer von Euch dies erklären?</p>
<p>Danke für Eure Unterstützung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1418365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1418365</guid><dc:creator><![CDATA[jopperl]]></dc:creator><pubDate>Mon, 10 Dec 2007 19:27:09 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Methodenaufruf - Parameter on Mon, 10 Dec 2007 19:48:56 GMT]]></title><description><![CDATA[<p>du musst einen Pointer auf eine Funktion übergeben, die als Parameter einen int erwartet und nichts zurückgibt.</p>
<pre><code class="language-cpp">void foo(int x)
{
    std::cout &lt;&lt; x;
}

int main()
{
    funcA(&amp;foo);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1418390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1418390</guid><dc:creator><![CDATA[darthdespotism]]></dc:creator><pubDate>Mon, 10 Dec 2007 19:48:56 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Methodenaufruf - Parameter on Mon, 10 Dec 2007 21:06:22 GMT]]></title><description><![CDATA[<p>Hallo und danke für deine Antwort.</p>
<p>Ich habe versucht das Ganze mal in ein eigenes Programm zu bringen, bekomme aber einen Fehler beim compilieren.</p>
<p>ClassA.h</p>
<pre><code class="language-cpp">class ClassA
{
private:

public:
	ClassA();
	~ClassA();
	void funcA();
protected:

};
</code></pre>
<p>ClassA.cpp</p>
<pre><code class="language-cpp">#include &quot;ClassA.h&quot;
#include &quot;ClassB.h&quot;

ClassA::ClassA()
{
}

ClassA::~ClassA()
{
}

void ClassA::funcA()
{
	ClassB b = ClassB::getInstance();
	b.funcB(&amp;funcA);
}
</code></pre>
<p>ClassB.h</p>
<pre><code class="language-cpp">class ClassB
{
private:

public:
	ClassB();
	~ClassB();
	void init();
	void funcB(void (*intHandler)(int));
	static ClassB&amp; getInstance()
	{
		return *pClassB;
	}
protected:
	static ClassB* pClassB;
};
</code></pre>
<p>ClassB.cpp</p>
<pre><code class="language-cpp">#include &quot;ClassB.h&quot;
#include &lt;iostream&gt;

using namespace std;

ClassB* ClassB::pClassB = 0;

ClassB::ClassB()
{
}

ClassB::~ClassB()
{
}

void ClassB::init()
{
	ClassB::pClassB = new ClassB();
}

void ClassB::funcB(void (*intHandler)(int))
{
	cout &lt;&lt; &quot;\n&quot; &lt;&lt; &amp;intHandler &lt;&lt; endl;
}
</code></pre>
<p>Compiler Ausgabe:</p>
<pre><code>classa.cpp(15) : error C2276: '&amp;' : illegal operation on bound member function expression
</code></pre>
<p>Wo liegt hier der Fehler???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1418436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1418436</guid><dc:creator><![CDATA[jopperl]]></dc:creator><pubDate>Mon, 10 Dec 2007 21:06:22 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Methodenaufruf - Parameter on Mon, 10 Dec 2007 22:16:47 GMT]]></title><description><![CDATA[<p>hat sich erledigt.</p>
<p>lösung:</p>
<p>ClassA.cpp</p>
<pre><code class="language-cpp">#include &quot;ClassA.h&quot;
#include &quot;ClassB.h&quot;

ClassA::ClassA()
{
}

ClassA::~ClassA()
{
}

void funcC(int i)
{
}

void ClassA::funcA()
{
	ClassB b = ClassB::getInstance();
	b.funcB(&amp;funcC);
}
</code></pre>
<p>Anscheinend können hier Pointer auf andere Methoden nicht übergeben werden oder evt. mit irgendeinem cast?.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1418461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1418461</guid><dc:creator><![CDATA[jopperl]]></dc:creator><pubDate>Mon, 10 Dec 2007 22:16:47 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Methodenaufruf - Parameter on Mon, 10 Dec 2007 22:35:01 GMT]]></title><description><![CDATA[<p>Du hattest oben versucht, eine memberfunktion von ClassA zu übergeben. das geht so nicht. Die hat eine andere Signatur wie eine freie Funktion mit der gleiche Parameterliste, da ja noch this mit übergeben werden muß. Siehe auch mal in der FAQ<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39450.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-39450.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1418463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1418463</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 10 Dec 2007 22:35:01 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Methodenaufruf - Parameter on Mon, 10 Dec 2007 23:47:48 GMT]]></title><description><![CDATA[<p>danke für deine antwort. ich habe jetzt versucht das in mein beispiel einzubauen aber irgendwie wird das nichts.</p>
<p>könntest du mir evt. einen tip geben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1418481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1418481</guid><dc:creator><![CDATA[jopperl]]></dc:creator><pubDate>Mon, 10 Dec 2007 23:47:48 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Methodenaufruf - Parameter on Tue, 11 Dec 2007 08:00:23 GMT]]></title><description><![CDATA[<p>Ich bin noch immer am Versuchen, aber leider habe ich noch immer keine Lösung gefunden. Vielleicht weiß ja einer von Euch noch einen Weg???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1418526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1418526</guid><dc:creator><![CDATA[jopperl]]></dc:creator><pubDate>Tue, 11 Dec 2007 08:00:23 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Methodenaufruf - Parameter on Tue, 11 Dec 2007 08:05:57 GMT]]></title><description><![CDATA[<p>Du kannst nur statische Methoden und globale Funktionen per Funktionszeiger übergeben, darum benötigst du eine andere Möglichkeit, an eine Klasseninstanz zu kommen, z.B.:</p>
<pre><code class="language-cpp">class ClassA
{
  static KlasseA classInst;
public:
  static void myFunc(int i)
  {
    classInst.methodeA(i);
  }

  void methodeA(int i)
  {...}
};

...
ClassB b
b.funcb(&amp;ClassA::myFunc);
</code></pre>
<p>(aus dem Grund hantieren Thread-Bibliotheken und ähnliches oft mit einem void-Zeiger, dem du ein Zielobjekt übergeben kannst)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1418530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1418530</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 11 Dec 2007 08:05:57 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Methodenaufruf - Parameter on Tue, 11 Dec 2007 08:10:16 GMT]]></title><description><![CDATA[<p>jopperl schrieb:</p>
<blockquote>
<p>Ich bin noch immer am Versuchen, aber leider habe ich noch immer keine Lösung gefunden. Vielleicht weiß ja einer von Euch noch einen Weg???</p>
</blockquote>
<p>Falls du noch immer hier eine nicht-statische Membermethode übergeben willst: Das lässt die verlangte Signatur einfach nicht zu. Ein Zeiger auf eine Methode braucht immer auch noch einen Instanzzeiger, die Signatur lässt aber keine Übergabe selbigen zu. Sofern du nicht die Funktion mit dem Callbackparameter selbst in Zugriff hast, lässt sich da auch nichts dran ändern.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1418532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1418532</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 11 Dec 2007 08:10:16 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Methodenaufruf - Parameter on Tue, 11 Dec 2007 08:17:58 GMT]]></title><description><![CDATA[<p>in dem oben geposteten Link gibts doch genau so ein Beispiel. ABer usm dir nochmal klarer zu gestalten:</p>
<pre><code class="language-cpp">void (*afunptr)(int); //afunptr ist ein Pointer auf eine Funktion, die einen int als Parameter hat und keinen Rückgabewert

std::string (MyClass::*amemfunptr)(); //amemfunptr ist ein Pointer auf eine Memberfunktion von MyClass, die keine Parameter nimmt und einen std::string liefert
</code></pre>
<p>Alternativ kann mans auch per typedefs machen:</p>
<pre><code class="language-cpp">typedef void (*FunPtr)(int); //FunPtr ist jetzt ein Alias für den Typ &quot;Pointer auf FUnktion mit Parameter int ohne Rückgabewert&quot;

FunPtr afunptr; //wie im oberen beispiel

class MyClass;
typedef std::string (MyClass::*MemFunPtr)(); //Typedef für den gleichen membefunktionstyp wie oben...

void f(MemFunPtr ptr) { //diese Funktion nimmt einen memberfunktionspointer vom obigen Typ
  MyClass c;
  cout &lt;&lt; c.ptr() &lt;&lt; endl; //führt die Funktion, auf die ptr Zeigt, für das Objekt c aus und gibt das ergebnis an cout.
}

class MyClass {
public:
  std::string fun1() {return std::string(&quot;lol&quot;);}
  std::string fun2() {return &quot;rofl&quot;;}
  std::string fun3(char c = 'c') {return std::string(c);}
}

int main() {
  f(&amp;MyClass::fun1); //OK, gibt lol aus
  MemFunPtr mfptr = &amp; MyClass::fun2; 
  f(mfptr); //OK, gibt rofl aus
  f(&amp;MyClass::fun3); //ERROR: fun3 hat die falsche Signatur, compiler bemängelt sowas wie &quot;cannot convert std::string(*)(char) to std::string(*)()&quot;
}
</code></pre>
<p>So, genug rumgespielt, ich denke das sollte es dir klarmachen <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/1418537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1418537</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 11 Dec 2007 08:17:58 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Methodenaufruf - Parameter on Tue, 11 Dec 2007 08:50:26 GMT]]></title><description><![CDATA[<p>hmm wobei wir das ja wie schon in anderen Thread gesagt schon 1000x bald hatten <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 />
Und davon mal abgesehen ... finde es immer etwas doof, wenn ihr da MyClass oder so hinschreibt. Das ist so zwar korrekt, aber da könnte auch MyStruct stehen ... geht damit ja genauso. struct und class sind in C++ nunmal identisch, mit der Ausnahme, dass sich die default-access-Art ändert ^^ d.h. bei struct public und bei class private.</p>
<p>Hatte auch beim letzten mal ein kleines Template dafür gepostet ... dass das alles schön verpackt, so das ihr damit nichts zu tun habt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1418560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1418560</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 11 Dec 2007 08:50:26 GMT</pubDate></item></channel></rss>