<?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[Member functions pointer]]></title><description><![CDATA[<p>hi,<br />
ich brauch euren rat, bin einfach zu blöd ein function einer klasse einer anderen klasse zu übergeben<br />
Also &quot;void (CLASS::<em>)()&quot; zu &quot;void(</em>)()&quot;</p>
<p>ich schreib einfach mal mein code rein.<br />
Wenn ich das versuche zu umschreiben, klappt das nicht so gut</p>
<pre><code>//Button.h 

class Button 
{ 
public: 
    Button (void); 
    ~Button (void); 

    void setFunc( void(*func)() ); 
    void Func(void) 

private: 
    void (*m_Func)(); 
};
</code></pre>
<pre><code>//Button.cpp

void Button::Func(void)
{
	m_Func();
}

void Button::setFunc(void (*func)(void))
{
	m_Func = func;
}
</code></pre>
<pre><code>//APP.cpp

void APP::Play()
{
    cout &lt;&lt; &quot;Play&quot; &lt;&lt; endl;
} 

int APP::Run(void)
{
    Button btn;
    btn.setFunc(APP::Play);   &lt;---------------------------------- Problem
</code></pre>
<pre><code>//main.cpp

int main()
{
    APP app;
    app.Run();
}
</code></pre>
<p>Ich hab es auch schon mit std::bind versucht, bekomm aber auch das nicht hin.<br />
Brauche bitte dringend eure hilfe.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/334872/member-functions-pointer</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 01:09:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/334872.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 16 Oct 2015 19:47:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Member functions pointer on Fri, 16 Oct 2015 19:47:49 GMT]]></title><description><![CDATA[<p>hi,<br />
ich brauch euren rat, bin einfach zu blöd ein function einer klasse einer anderen klasse zu übergeben<br />
Also &quot;void (CLASS::<em>)()&quot; zu &quot;void(</em>)()&quot;</p>
<p>ich schreib einfach mal mein code rein.<br />
Wenn ich das versuche zu umschreiben, klappt das nicht so gut</p>
<pre><code>//Button.h 

class Button 
{ 
public: 
    Button (void); 
    ~Button (void); 

    void setFunc( void(*func)() ); 
    void Func(void) 

private: 
    void (*m_Func)(); 
};
</code></pre>
<pre><code>//Button.cpp

void Button::Func(void)
{
	m_Func();
}

void Button::setFunc(void (*func)(void))
{
	m_Func = func;
}
</code></pre>
<pre><code>//APP.cpp

void APP::Play()
{
    cout &lt;&lt; &quot;Play&quot; &lt;&lt; endl;
} 

int APP::Run(void)
{
    Button btn;
    btn.setFunc(APP::Play);   &lt;---------------------------------- Problem
</code></pre>
<pre><code>//main.cpp

int main()
{
    APP app;
    app.Run();
}
</code></pre>
<p>Ich hab es auch schon mit std::bind versucht, bekomm aber auch das nicht hin.<br />
Brauche bitte dringend eure hilfe.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471340</guid><dc:creator><![CDATA[crischan]]></dc:creator><pubDate>Fri, 16 Oct 2015 19:47:49 GMT</pubDate></item><item><title><![CDATA[Reply to Member functions pointer on Fri, 16 Oct 2015 19:52:55 GMT]]></title><description><![CDATA[<p>Du musst bei Memberfunktionen den Adressoperator verwenden...</p>
<pre><code>btn.setFunc(&amp;APP::Play);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2471342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471342</guid><dc:creator><![CDATA[OlafGunterJochenPaul]]></dc:creator><pubDate>Fri, 16 Oct 2015 19:52:55 GMT</pubDate></item><item><title><![CDATA[Reply to Member functions pointer on Fri, 16 Oct 2015 19:56:02 GMT]]></title><description><![CDATA[<p>Achja und der Parameter von &quot;setFunc&quot; muss etwa so aussehen: (void (APP::*fp)())</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471343</guid><dc:creator><![CDATA[OlafGunterJochenPaul]]></dc:creator><pubDate>Fri, 16 Oct 2015 19:56:02 GMT</pubDate></item><item><title><![CDATA[Reply to Member functions pointer on Fri, 16 Oct 2015 20:01:47 GMT]]></title><description><![CDATA[<p>ja, das schlagt mir mein vs2012 auch vor, geht aber auch nicht</p>
<p>[EDIT]<br />
ja, das wäre ne möglichkeit, aber dann ist mir Button zu unflexibel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471344</guid><dc:creator><![CDATA[crischan]]></dc:creator><pubDate>Fri, 16 Oct 2015 20:01:47 GMT</pubDate></item><item><title><![CDATA[Reply to Member functions pointer on Fri, 16 Oct 2015 20:33:49 GMT]]></title><description><![CDATA[<blockquote>
<p>ja, das wäre ne möglichkeit, aber dann ist mir Button zu unflexibel</p>
</blockquote>
<p>Dein momentanes Design bietet sowieso keine Flexibilität. So müssen z.B alle Funktionen den Rückgabetyp void aufweisen und dürfen keine Parameter enthalten. Der Button hat keine Oberklasse (wtf?). Templates werden nicht verwendet und ohnehin: Eine Button-Klasse würde man ganz klar als Funktor implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471347</guid><dc:creator><![CDATA[OlafGunterJochenPaul]]></dc:creator><pubDate>Fri, 16 Oct 2015 20:33:49 GMT</pubDate></item><item><title><![CDATA[Reply to Member functions pointer on Fri, 16 Oct 2015 21:16:34 GMT]]></title><description><![CDATA[<p>ok,<br />
ich bin noch nicht so lange bei c++ und kenne mich daher noch nicht so gut aus.<br />
Bisher hat mein Butten.h immer ausgereicht.</p>
<p>Von dem was du gerade sagst, versteh ich nicht wirklch was du mir sagen willst.<br />
Templates sagt mir was, aber was soll Oberklasse bedeuten und Funktor implementieren?</p>
<p>Ich werde das jetzt, bzw morgen, mal nach googlen.<br />
aber vllt kannst du mir das in diesem zusammenhang besser erklären</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471349</guid><dc:creator><![CDATA[crischan]]></dc:creator><pubDate>Fri, 16 Oct 2015 21:16:34 GMT</pubDate></item><item><title><![CDATA[Reply to Member functions pointer on Fri, 16 Oct 2015 21:31:36 GMT]]></title><description><![CDATA[<p>Gestern in deinem anderen Thread, als du quasi die umgekehrte Frage gestellt hast, habe ich dir std::bind empfohlen. Nun muss die umgekehrte Empfehlung std::function sein. Alles was du hier und in dem anderen Thread mühsam versuchst, sind von den beiden längst viel besser gelöst worden:</p>
<pre><code>#include &lt;functional&gt;

class Button
{
  // Allgemeines Ding, das sich wie eine Funktion verhält, die void zurück gibt und keine Parameter hat:
  std::function&lt;void()&gt; f;

public:
  // Akzeptiert alles, was sich irgendwie void()-artig aufrufen lässt:
  template &lt;typename T&gt; void set_function(T t) { f = t; }

  void invoke_function()
  {
    f();
  }
};

// von hier an dient alles nur der Demonstration:
#include &lt;iostream&gt;
using std::cout;

void void_funktion_ohne_parameter() { cout &lt;&lt; &quot;void_funktion_ohne_parameter\n&quot;; }

void void_funktion_mit_parameter(int i) { cout &lt;&lt; &quot;void_funktion_mit_parameter: &quot; &lt;&lt; i &lt;&lt; '\n'; }

struct Foo 
{ 
  void nicht_statische_memberfunktion_ohne_parameter() { cout &lt;&lt; &quot;nicht_statische_memberfunktion_ohne_parameter\n&quot;; }
  void nicht_statische_memberfunktion_mit_parameter(int i) { cout &lt;&lt; &quot;nicht_statische_memberfunktion_mit_parameter: &quot; &lt;&lt; i &lt;&lt; '\n'; }
  static void statische_memberfunktion() { cout &lt;&lt; &quot;Langweilig!\n&quot;; }
};

struct Functor
{
  void operator()() { cout &lt;&lt; &quot;Functor\n&quot;; }
};

int main()
{
  using std::bind;

  Button button;

  button.set_function(void_funktion_ohne_parameter);  // Bei freien Funktionen kann man den Adressoperator auch weglassen
  button.invoke_function();

  button.set_function(bind(void_funktion_mit_parameter, 5));  // Schnürt die Funktion und den Parameter zusammen zu einer parameterlosen Funktion
  button.invoke_function();

  Foo foo;

  button.set_function(bind(&amp;Foo::nicht_statische_memberfunktion_ohne_parameter, &amp;foo));  // Bei Memberfunktionen ist der Adressoperator nötig
  button.invoke_function();

  button.set_function(bind(&amp;Foo::nicht_statische_memberfunktion_mit_parameter, &amp;foo, 5));  // Das Objekt auf dem eine Memberfunktion aufgerufen wird, ist quasi auch nur ein Paramter der Funktion und kann von bind zu einer parameterlosen Funktion zusammen geschnürt werden
  button.invoke_function();

  button.set_function(Foo::statische_memberfunktion);  // Statische Memberfunktionen sind auch nicht anders als freie Funktionen mit besonderem Namen.
  button.invoke_function();

  button.set_function(Functor());  // ALLES was irgendwie wie void() aufrufbar ist funktioniert
  button.invoke_function();

  button.set_function([](){cout&lt;&lt;&quot;Lambda\n&quot;;});  // Das ist insbesondere praktisch für Lambdas
  button.invoke_function();
}
</code></pre>
<p><a href="http://ideone.com/vAVaQT" rel="nofollow">http://ideone.com/vAVaQT</a></p>
<p>std::function und std::bind kochen natürlich auch nur mit Wasser. Aber bis du das selber mit diesem Komfort und Funktionsumfang nachprogrammiert hättest, würden ein paar Monate oder Jahre vergehen. Sei stattdessen froh, dass du dich nicht länger mit den Vorgängerversionen von bind und function herumschlagen musst! Die waren wirklich grausam <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> . Wagemutige können hier unter &quot;Deprecated in C++11&quot; gucken:<br />
<a href="http://en.cppreference.com/w/cpp/utility/functional" rel="nofollow">http://en.cppreference.com/w/cpp/utility/functional</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471350</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 16 Oct 2015 21:31:36 GMT</pubDate></item><item><title><![CDATA[Reply to Member functions pointer on Sun, 18 Oct 2015 18:54:50 GMT]]></title><description><![CDATA[<p>danke,</p>
<p>ihr habt mir sehr geholfen <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>Eine frage hab ich aber noch<br />
Gibt es eine möglichkeit bind in der Button klasse zu benutzen?<br />
Also nicht</p>
<pre><code>button.set_function(bind(&amp;Foo::nicht_statische_memberfunktion_ohne_parameter, &amp;foo));
</code></pre>
<p>sondern so das ich ganz normal &quot;Foo::nicht_statische_memberfunktion_ohne_parameter&quot; übergebe und dann mit bind arbeiten kann?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471519</guid><dc:creator><![CDATA[crischan]]></dc:creator><pubDate>Sun, 18 Oct 2015 18:54:50 GMT</pubDate></item><item><title><![CDATA[Reply to Member functions pointer on Sun, 18 Oct 2015 19:59:14 GMT]]></title><description><![CDATA[<p>Für welches Objekt soll denn die nicht-statische Memberfunktion dann aufgerufen werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471522</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 18 Oct 2015 19:59:14 GMT</pubDate></item><item><title><![CDATA[Reply to Member functions pointer on Sun, 18 Oct 2015 20:31:15 GMT]]></title><description><![CDATA[<p>ja ok,</p>
<p>ich weiss war ne blöde frage, aber hätte ja sein können das es da ne möglichkeit gibt.</p>
<p>Dachte fragen kost nix <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471535</guid><dc:creator><![CDATA[crischan]]></dc:creator><pubDate>Sun, 18 Oct 2015 20:31:15 GMT</pubDate></item></channel></rss>