<?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[Pointer auf Memberfunktion]]></title><description><![CDATA[<p>hi,</p>
<p>ich will einer Klassen Methode einen Pointer auf eine Methode eine anderen Objekts übergeben</p>
<p>So in der Art</p>
<pre><code class="language-cpp">class Klasse1
{
private:
  int i;
public:
  Klasse1(int i) { this-&gt;i = i; }
  void Methode() { cout &lt;&lt; this-&gt;i &lt;&lt; endl; }
};

class Klasse2
{
private:
  void* object;
  void* methode;
public:
  Klasse2(void* obj, void* mth) {
    this-&gt;object = obj;
    this-&gt;methode = mth; }
  void Exec() {
    //Hier soll nun die methode von object ausgeführt werden
    object-&gt;methode(); }
};
int main()
{
  Klasse1 k1(5);
  Klasse2 k2(&amp;k1, &amp;k1.methode);

  k2.Exec();  //Soll 5 ausgeben
  return 0;
}
</code></pre>
<p>hoffe es ist klar, was ich meine xD<br />
Schonmal vielen Dank für eure Hilfe</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262059/pointer-auf-memberfunktion</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 23:40:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262059.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 28 Feb 2010 13:43:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer auf Memberfunktion on Sun, 28 Feb 2010 13:43:19 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>ich will einer Klassen Methode einen Pointer auf eine Methode eine anderen Objekts übergeben</p>
<p>So in der Art</p>
<pre><code class="language-cpp">class Klasse1
{
private:
  int i;
public:
  Klasse1(int i) { this-&gt;i = i; }
  void Methode() { cout &lt;&lt; this-&gt;i &lt;&lt; endl; }
};

class Klasse2
{
private:
  void* object;
  void* methode;
public:
  Klasse2(void* obj, void* mth) {
    this-&gt;object = obj;
    this-&gt;methode = mth; }
  void Exec() {
    //Hier soll nun die methode von object ausgeführt werden
    object-&gt;methode(); }
};
int main()
{
  Klasse1 k1(5);
  Klasse2 k2(&amp;k1, &amp;k1.methode);

  k2.Exec();  //Soll 5 ausgeben
  return 0;
}
</code></pre>
<p>hoffe es ist klar, was ich meine xD<br />
Schonmal vielen Dank für eure Hilfe</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862323</guid><dc:creator><![CDATA[leb0rtran]]></dc:creator><pubDate>Sun, 28 Feb 2010 13:43:19 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Memberfunktion on Sun, 28 Feb 2010 13:57:42 GMT]]></title><description><![CDATA[<p>bin kein c++ spezialist, hätte aber evtl. einen vorschlag wie man das lösen könnte</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

#define METHOD_A 0
#define METHOD_B 1

class Klasse1
{
private:
  int i;
public:
  Klasse1(int i) { this-&gt;i = i; }
  void methodeA() { cout &lt;&lt; this-&gt;i &lt;&lt; endl; }
  void methodeB() { cout &lt;&lt; this-&gt;i-2 &lt;&lt; endl; }
};

class Klasse2
{
private:
  Klasse1 *cls;
  int methode;
public:
  Klasse2(Klasse1 *c,int m) {
	  cls = c;
	  methode = m;
  }
  void Exec() {
	  switch(methode){
	  case METHOD_A:
		  cls-&gt;methodeA();
	  break;
	  case METHOD_B:
		  cls-&gt;methodeB();
  	  break;
	  }
  }
};
int main()
{
  Klasse1 k1(5);

  Klasse2 k2(&amp;k1,METHOD_B);
  k2.Exec();
  Klasse2 k3(&amp;k1,METHOD_A);
  k3.Exec();

  return 0;
}
</code></pre>
<p>lg lolo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862327</guid><dc:creator><![CDATA[noobLolo]]></dc:creator><pubDate>Sun, 28 Feb 2010 13:57:42 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Memberfunktion on Sun, 28 Feb 2010 14:14:21 GMT]]></title><description><![CDATA[<p>Hier gibt es ein sehr schönes und ausführliches Tutorial über (Member)-Funktionszeiger:<br />
<a href="http://www.newty.de/fpt/index.html" rel="nofollow">http://www.newty.de/fpt/index.html</a></p>
<p>Dort findest du genau das, was du suchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862329</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 28 Feb 2010 14:14:21 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Memberfunktion on Sun, 28 Feb 2010 15:23:54 GMT]]></title><description><![CDATA[<p>leb0rtran schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Klasse2
{
private:
  void* object;
  void* methode;
public:
  Klasse2(void* obj, void* mth) {
    this-&gt;object = obj;
    this-&gt;methode = mth; }
  void Exec() {
    //Hier soll nun die methode von object ausgeführt werden
    object-&gt;methode(); }
};
</code></pre>
</blockquote>
<p>Vom Ansatz er gar nicht so verkehrt. Die &quot;Methoden&quot; (in C++ &quot;Elementfunktionen&quot; genannt) sind ja eigentlich nur Funktionen, die zusätzlich auf irgend eine Art und Weise den this-Zeiger bekommen. Das ist allerdings implementierungsabhängig und es gibt keine Standard-konforme Syntax, Elementfunktionen anand von void*-Zeigern auf zu rufen. Der eine oder andere Compiler (zB GCC) besitzt Erweiterungen, mit denen Du Elementfunktionszeiger zu normalen Funktionszeigern konvertieren kannst. Ich würde Dir aber davon abraten. Dass würde ich erst anfassen, wenn alles andere zu langsam ist. Es gibt auch noch eine Falle bzgl. der Anpassung von Zeigern (base/derived pointer adjustments), auf die man aufpassen muss.</p>
<p>Lösung 1: Verwende std::tr1::function oder <a href="http://www.boost.org/doc/libs/1_42_0/doc/html/function.html" rel="nofollow">boost::function</a></p>
<p>Lösung 2: einfachen Wrapper selbst bauen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cassert&gt;

template&lt;class Clazz, void (Clazz::*Pmf)()&gt;
class simple_memfun_proxy // 0 args, non-const memfun --&gt; void
{
public:
   static void invoke(void* obj) {
      return (static_cast&lt;Clazz*&gt;(obj)-&gt;*Pmf)();
   }
};

class Delegate
{
  static void null_func(void*) {assert(false);}
  void *obj;
  void (*fun)(void*);
public:
  Delegate() : obj(0), fun(&amp;null_func) {}

  template&lt;class T, class Clazz, void (Clazz::*Pmf)()&gt;
  Delegate(T* o1, simple_memfun_proxy&lt;Clazz,Pmf&gt;) {
    Clazz* o2 = o1; // for implicit pointer adjustments
    obj = o2;       // must NOT convert o1 directly to void* !!!
    fun = &amp;simple_memfun_proxy&lt;Clazz,Pmf&gt;::invoke;
  }

  bool valid() const {return fun!=&amp;null_func;}

  void operator()() const {
    return fun(obj);
  }
};

#define MAKE_DELEGATE(ObjPtr,Klazz,FuncName) \
   Delegate(ObjPtr, \
      simple_memfun_proxy&lt;Klazz,&amp;Klazz::FuncName&gt;())

class K {
  int zz;
public:
  explicit K(int z) : zz(z) {}
  void boo() {
	  std::cout &lt;&lt; zz &lt;&lt; '\n';
  }
};

int main()
{
  K k (23);
  Delegate d = MAKE_DELEGATE(&amp;k,K,boo);
  d();
}
</code></pre>
<p>So funktioniert das natürlich nur für Elementfunktionen, die keine weiteren Parameter benötigen, nicht const sind und auch nichts zurückgeben. Um auch const-Elementfunktionen zu unterstützen, oder solche, die mehrere Parameter annehmen können bzw etwas zurück geben können, ist dann etwas mehr Code nötig.</p>
<p>Wie's funktioniert? Im Prinzip wird durch das erste Klassen-Template eine freie Funktion pro Klassen/MemberFunction-Kombination generiert, welche den Aufruf weiterleitet, dafür aber eine einheitliche und Klassen/Methoden-agnostische Schnittstelle anbietet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862345</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sun, 28 Feb 2010 15:23:54 GMT</pubDate></item></channel></rss>