<?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[Methodenaufruf mittels Methodenzeiger aus anderer Klasser heraus]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgendes Problem:<br />
ich habe eine Klasse (nennen wir sie mal A), welche eine Funktion (foo) hat, die einen Funktionspointer als Parameter erwartet. Also etwa so:</p>
<pre><code class="language-cpp">class A{
public:
  int foo(int (*func)(int));
};

int A::foo(int (*func)(int)){
  return func(1);
}
</code></pre>
<p>soweit so gut. Jetzt gibt es noch andere Klassen, welche die Methode foo aufrufen und eine eigene Methode als Funktionszeiger übergeben sollen. Also etwa so:</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;

class B{
public:
  int test();
  int handler(int);
  int daten;
};

int B::test(){
  A a;
  return a.foo(handler);
}

int B::handler(int x){
  return x+daten;
}
</code></pre>
<p>und zb. noch</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;

class C{
public:
  int test();
  int handler(int);
  int daten;
};

int C::test(){
  A a;
  return a.foo(handler);
}

int C::handler(int x){
  return x-daten;
}
</code></pre>
<p>dann noch eine main dazu:</p>
<pre><code class="language-cpp">#include &quot;B.h&quot;
#include &quot;C.h&quot;

int main(){
  B b;
  C c;
  b.daten = 1;
  c.daten = 2;
  printf(&quot;B: %d\n&quot;,b.test());
  printf(&quot;C: %d\n&quot;,c.test());
}
</code></pre>
<p>Das Problem liegt jetzt darin, dass ich die Methode nicht so wie in dem Beispiel oben direkt übergeben kann (<strong>a.foo(handler);</strong> funktioniert nicht, da handler vom Typ <strong>int ( B:: )(int)</strong> bzw. <strong>int ( C:: )(int)</strong> ist und eben nicht <strong>int (*)(int)</strong> ).<br />
Seht ihr eine Möglichkeit das Problem zu umgehen etc.?</p>
<p>.. natürlich sollen die Funktionen etwas anderes machen, aber um das Prinzip zu diskutieren ist es vllt einfacher ein primitives (und in diesem Fall sinnloses) Beispiel zu nehmen <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>
<p>In dem Fall würde ich wollen, dass der Aufruf <strong>b.test();</strong> als Ergebnis 2 liefert:<br />
B::test() -&gt; A::foo() -&gt; B::handler(1) =&gt; 2 =&gt; 2</p>
<p>entsprechend:<br />
C::test() -&gt; A::foo() -&gt; C::handler(1) =&gt; -1 =&gt; -1</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/295708/methodenaufruf-mittels-methodenzeiger-aus-anderer-klasser-heraus</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 08:31:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/295708.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 19 Nov 2011 18:10:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Methodenaufruf mittels Methodenzeiger aus anderer Klasser heraus on Sat, 19 Nov 2011 18:10:35 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgendes Problem:<br />
ich habe eine Klasse (nennen wir sie mal A), welche eine Funktion (foo) hat, die einen Funktionspointer als Parameter erwartet. Also etwa so:</p>
<pre><code class="language-cpp">class A{
public:
  int foo(int (*func)(int));
};

int A::foo(int (*func)(int)){
  return func(1);
}
</code></pre>
<p>soweit so gut. Jetzt gibt es noch andere Klassen, welche die Methode foo aufrufen und eine eigene Methode als Funktionszeiger übergeben sollen. Also etwa so:</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;

class B{
public:
  int test();
  int handler(int);
  int daten;
};

int B::test(){
  A a;
  return a.foo(handler);
}

int B::handler(int x){
  return x+daten;
}
</code></pre>
<p>und zb. noch</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;

class C{
public:
  int test();
  int handler(int);
  int daten;
};

int C::test(){
  A a;
  return a.foo(handler);
}

int C::handler(int x){
  return x-daten;
}
</code></pre>
<p>dann noch eine main dazu:</p>
<pre><code class="language-cpp">#include &quot;B.h&quot;
#include &quot;C.h&quot;

int main(){
  B b;
  C c;
  b.daten = 1;
  c.daten = 2;
  printf(&quot;B: %d\n&quot;,b.test());
  printf(&quot;C: %d\n&quot;,c.test());
}
</code></pre>
<p>Das Problem liegt jetzt darin, dass ich die Methode nicht so wie in dem Beispiel oben direkt übergeben kann (<strong>a.foo(handler);</strong> funktioniert nicht, da handler vom Typ <strong>int ( B:: )(int)</strong> bzw. <strong>int ( C:: )(int)</strong> ist und eben nicht <strong>int (*)(int)</strong> ).<br />
Seht ihr eine Möglichkeit das Problem zu umgehen etc.?</p>
<p>.. natürlich sollen die Funktionen etwas anderes machen, aber um das Prinzip zu diskutieren ist es vllt einfacher ein primitives (und in diesem Fall sinnloses) Beispiel zu nehmen <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>
<p>In dem Fall würde ich wollen, dass der Aufruf <strong>b.test();</strong> als Ergebnis 2 liefert:<br />
B::test() -&gt; A::foo() -&gt; B::handler(1) =&gt; 2 =&gt; 2</p>
<p>entsprechend:<br />
C::test() -&gt; A::foo() -&gt; C::handler(1) =&gt; -1 =&gt; -1</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2146409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2146409</guid><dc:creator><![CDATA[Bärtierchen]]></dc:creator><pubDate>Sat, 19 Nov 2011 18:10:35 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufruf mittels Methodenzeiger aus anderer Klasser heraus on Sat, 19 Nov 2011 18:31:51 GMT]]></title><description><![CDATA[<p>Es gibt in TR1 und C++11 Templates std::tr1::function und std::tr1::bind bzw. std::function und std::bind, mit denen man das machen könnte:</p>
<pre><code class="language-cpp">void call_with_one(std::tr1::function&lt;void(int)&gt; const &amp;func) {
  func(1);
}

class A {
public:
  void foo(int) { }
  void bar() { call_with_one(std::tr1::bind(&amp;A::foo, this, std::tr1::placeholders::_1)); }
};
</code></pre>
<p>...für _1, _2 etc. ist eine using-Direktive empfehlenswert, wenn man das ernsthaft betreibt.</p>
<p>Wenn dein Compiler TR1 und C++11 nicht beherrscht, gibt es das auch in Boost.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2146418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2146418</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 19 Nov 2011 18:31:51 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufruf mittels Methodenzeiger aus anderer Klasser heraus on Sat, 19 Nov 2011 20:44:01 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>danke für die Antwort. Das kannte ich noch nicht. Aber nachdem ich mir das mal (zumindest grob) angeschaut hab seh ich ehrlich gesagt noch nicht, wie das mein Problem löst. Vllt steh ich grad auch nur gewaltig auf dem Schlauch.<br />
Mein Problem liegt ja darin, dass die Funktion <strong>foo</strong> der Klasse <strong>A</strong> eine Methode von einem Objekt aufrufen muss, welches sie nicht kennt. Also beim ersten Aufruf muss ja <strong>B::handler(1)</strong> aufgerufen werden, das Objekt <strong>b</strong> der klasse <strong>B</strong> wurde aber in der main angelegt und wird auch nicht an die Klasse <strong>A</strong> weitergereicht (bzw. das Objekt <strong>a</strong>)<br />
Mit dem <strong>bind</strong> könnte ich jetzt in der Methode <strong>test</strong> die Methode <strong>foo</strong> an <strong>this</strong> binden, aber dann müsste <strong>foo</strong> als Parameter ein Objekt der Klasse <strong>B</strong> annehmen. Damit wäre es aber auf diese Klasse spezialisiert.</p>
<p>Ein anderer Gedanke, der mir jetzt gerade noch gekommen ist wäre es mit einer Template-Klasse zu probieren.</p>
<p>Falls ich auf eien Grünen Zweig komm meld ich mich nochmal. Falls mir jemand erklären kann wie mich das <strong>bind</strong> weiterbringt - vielen Dank <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>
<p>Steffen</p>
<p>PS: Compiler müsste glaube ich der GCC sein (mit Eclipse unter Linux). Eclipse scheint C++11 noch nicht zu &quot;kennen&quot; (zumindest der automatische Syntax-Check nicht), aber der compiler kanns.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2146462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2146462</guid><dc:creator><![CDATA[Bärtierchen]]></dc:creator><pubDate>Sat, 19 Nov 2011 20:44:01 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufruf mittels Methodenzeiger aus anderer Klasser heraus on Sat, 19 Nov 2011 21:14:48 GMT]]></title><description><![CDATA[<p>Bärtierchen schrieb:</p>
<blockquote>
<p>Eclipse scheint C++11 noch nicht zu &quot;kennen&quot; (zumindest der automatische Syntax-Check nicht), aber der compiler kanns.</p>
</blockquote>
<p>Eclipse kennt die vom Compiler vordefinierte Konstante __GXX_EXPERIMENTAL_CXX0X__ nicht. Du muss es unter &quot;Path and Symbols&quot; in den Projekteinstellungen eintragen (achte darauf, dass du bei C++ einträgst). Dann funktioniert es.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2146469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2146469</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 19 Nov 2011 21:14:48 GMT</pubDate></item><item><title><![CDATA[Reply to Methodenaufruf mittels Methodenzeiger aus anderer Klasser heraus on Sat, 19 Nov 2011 22:44:07 GMT]]></title><description><![CDATA[<p>Ich verstehe nicht, wo du das Problem siehst. Mal 1:1 mit TR1 auf deinen Code umgemünzt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
// das tr1/-Präfix ist gcc-spezifisch. Ggf. kann man das per Präprozessor
// portabel machen; ansonsten ist das alles in C++11 im Header &lt;functional&gt;
// und direkt im namespace std.
#include &lt;tr1/functional&gt;

class A{
public:
  int foo(std::tr1::function&lt;int(int)&gt; const &amp;func);
};

int A::foo(std::tr1::function&lt;int(int)&gt; const &amp;func) {
  return func(1);
}

class B{
public:
  int test();
  int handler(int);
  int daten;
};

int B::test(){
  using std::tr1::placeholders::_1;
  using std::tr1::bind;

  A a;
  return a.foo(bind(&amp;B::handler, this, _1));
}

int B::handler(int x){
  return x+daten;
}

class C{
public:
  int test();
  int handler(int);
  int daten;
};

int C::test(){
  using std::tr1::placeholders::_1;
  using std::tr1::bind;

  A a;
  return a.foo(bind(&amp;C::handler, this, _1));
}

int C::handler(int x){
  return x-daten;
}

int main() {
  B b;
  C c;
  b.daten = 1;
  c.daten = 2;
  std::cout &lt;&lt;
    &quot;B: &quot; &lt;&lt; b.test() &lt;&lt; &quot;\n&quot;
    &quot;C: &quot; &lt;&lt; c.test() &lt;&lt; '\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2146485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2146485</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 19 Nov 2011 22:44:07 GMT</pubDate></item></channel></rss>