<?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[und noch eine Frage zu Zeigern auf MemberFunktionen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche, den Compiler zu überreden, dass ich dabei (markierte Zeile im Code) nichts Böses will.<br />
Kann mir jemand mit einem Tipp helfen?<br />
Tausend Dank im Voraus!</p>
<p>PS: Die FAQ habe ich schon gelesen</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 

class A { 
public: 
   int fA(); 
}; 

int A::fA() { return 1; } 
//----------------------------------------
class B { 
public: 
   B(); 
   int (A::*pFunc)();
   int fB();

}; 

int B::fB(){ return 2; }

B::B() { 
   pFunc = &amp;A::fA;
//	pFunc = &amp;B::fB; //hier weint der Compiler
}

//----------------------------------------
int main() 
{ 
   B b; 
   A a; 

   std::cout &lt;&lt; (a.*b.pFunc)() &lt;&lt; std::endl;
   return 0;
 }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/135128/und-noch-eine-frage-zu-zeigern-auf-memberfunktionen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 21:18:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/135128.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 30 Jan 2006 21:07:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to und noch eine Frage zu Zeigern auf MemberFunktionen on Mon, 30 Jan 2006 21:07:14 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche, den Compiler zu überreden, dass ich dabei (markierte Zeile im Code) nichts Böses will.<br />
Kann mir jemand mit einem Tipp helfen?<br />
Tausend Dank im Voraus!</p>
<p>PS: Die FAQ habe ich schon gelesen</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 

class A { 
public: 
   int fA(); 
}; 

int A::fA() { return 1; } 
//----------------------------------------
class B { 
public: 
   B(); 
   int (A::*pFunc)();
   int fB();

}; 

int B::fB(){ return 2; }

B::B() { 
   pFunc = &amp;A::fA;
//	pFunc = &amp;B::fB; //hier weint der Compiler
}

//----------------------------------------
int main() 
{ 
   B b; 
   A a; 

   std::cout &lt;&lt; (a.*b.pFunc)() &lt;&lt; std::endl;
   return 0;
 }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/981562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981562</guid><dc:creator><![CDATA[Sergey]]></dc:creator><pubDate>Mon, 30 Jan 2006 21:07:14 GMT</pubDate></item><item><title><![CDATA[Reply to und noch eine Frage zu Zeigern auf MemberFunktionen on Mon, 30 Jan 2006 21:32:07 GMT]]></title><description><![CDATA[<p>Geht nicht</p>
<pre><code class="language-cpp">int (A::*pFunc)();
</code></pre>
<p>bedeutet eine menberfunktion der klasse A ohne parameter die int zurückgibt.<br />
B::fB() ist keine menberfunktion von A;<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981580</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Mon, 30 Jan 2006 21:32:07 GMT</pubDate></item><item><title><![CDATA[Reply to und noch eine Frage zu Zeigern auf MemberFunktionen on Mon, 30 Jan 2006 21:48:44 GMT]]></title><description><![CDATA[<p>danke für die rasche antwort!</p>
<p>ZuK schrieb:</p>
<blockquote>
<p>B::fB() ist keine menberfunktion von A;</p>
</blockquote>
<p>eben!<br />
Die Frage: Was muss ich machen, sodass es doch geht?</p>
<p>Sergey</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981600</guid><dc:creator><![CDATA[Sergey]]></dc:creator><pubDate>Mon, 30 Jan 2006 21:48:44 GMT</pubDate></item><item><title><![CDATA[Reply to und noch eine Frage zu Zeigern auf MemberFunktionen on Mon, 30 Jan 2006 22:13:20 GMT]]></title><description><![CDATA[<p>1. Möglichkeit<br />
Du machst die Funktionen static und nimmst einen &quot;normalen&quot; Funktionszeiger. Du hast dann natürlich kein Objekt mehr, auf das du in den Funktionen mittels this zugreifen kannst.</p>
<p>2. Möglichkeit<br />
Ändere dein Design! Ich frage mich, wozu du einen Funktionszeiger auf eine A Memberfunktion definierst, und diesem dann eine B Memberfunktion zuweisen willst. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/981611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981611</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 30 Jan 2006 22:13:20 GMT</pubDate></item><item><title><![CDATA[Reply to und noch eine Frage zu Zeigern auf MemberFunktionen on Mon, 30 Jan 2006 22:15:14 GMT]]></title><description><![CDATA[<p>du willst doch in</p>
<pre><code class="language-cpp">std::cout &lt;&lt; (a.*b.pFunc)() &lt;&lt; std::endl;
</code></pre>
<p>eine member-funktion von A aufrufen. da kann pFunc sowieso keine memberfunktion von B sein!</p>
<p>wenn pFunc eine member-funktion von B sein soll, dann mußt du sie als</p>
<pre><code class="language-cpp">int (B::*pFunc)();
</code></pre>
<p>deklarieren. dann mußt du pFunc aber auch auf ein objekt von der klasse B anwenden. schließlich kannst du ja auch nicht einfach die istream-methode flush() auf ein vector-objekt anwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981612</guid><dc:creator><![CDATA[Konfusius]]></dc:creator><pubDate>Mon, 30 Jan 2006 22:15:14 GMT</pubDate></item><item><title><![CDATA[Reply to und noch eine Frage zu Zeigern auf MemberFunktionen on Mon, 30 Jan 2006 23:15:16 GMT]]></title><description><![CDATA[<p>Vielleicht ein wenig Hintergründinformation zu meiner Frage.<br />
Ich möchte einen einfachen Taskmanager für embedded systems implementieren. Die Polymorphie steht dabei NICHT zur Verfügung!!! Es gibt eine Basisklasse CTask und ich leite davon konkrete Tasks ab. Dabei überlade! ich die Memberfunktion run(), weil hier die eigentliche Funktionalität des Tasks implementiert wird. Die Task-Objekte werden beim Taskmanager registriert. Er trägt sie zum Beispiel in ein Array ein. Beim Auftreten eines Ereignisses, wählt der Taskmanager einen Eintrag und ruft seine run()-Funktion.<br />
Falls man die run()-Funktion als virtual in der Klasse CTask deklariert hat, wird zur Laufzeit die „richtige“ run() aufgerufen. Die Erweiterbarkeit dieser Lösung ist sehr gut. Ich kann tausende Task-Klassen implementieren, und nur die run() überschreiben.</p>
<p>ABER! Ich darf ja keine Polymorphie benutzen.<br />
Dann wird immer die run() der Basisklasse aufgerufen.</p>
<p>Es gibt natürlich verschiedene Lösungen (z.B. in Tasks irgendwelche Eigenschaften speichern, abfragen und dann entscheiden welche run() aufgerufen wird). Diese haben einen Nachteil – schlechte Erweiterbarkeit. Bei jeder neuen Task-Klasse, muss die Basisklasse CTask geändert werden.</p>
<p>Aus diesem Grund dachte ich, dieses Problem anders zu lösen:<br />
Die Basisklasse hat eine run()-Funktion und einen Zeiger fptr auf eine Memberfunktion.<br />
Ich implementiere in jeder Kindklasse die run() neu, und lasse den geererbten fptr auf die &amp;run dieser Kindklasse zeigen.<br />
Dann müsste der Taskmanager über den fptr immer die „richtige“ run() aufrufen ganz ohne die Polymorphie. Das System wäre genau so erweiterbar, wie mit der Polymorphie.</p>
<p>Wenn ein Objekt im Heap-Bereich erzeugt wird, speichert es neben seinen Attributen nur die Referenzen zu den Implementierungen seiner Funktionen im Stack-Bereich. Ich kann dann den Pointer auf eine Memberfunktion darauf zeigen lassen. Dementsprechend kann genau diese Memberfunktion über den Pointer aufgerufen werden.</p>
<p>Lieder meckert der Compiler, wenn ich den Zeiger fptr zu einer Funktion, die nicht von der Basisklasse ist, umbiege. Die Typen passen nicht mehr. Die Funktion soll von der Basisklasse sein.</p>
<p>Sagt mir bitte, falls ich irgendwo Gedankenfehler mache?<br />
Falls nicht, hilft mir bitte, den Compiler auszutricksen.</p>
<p>Viele Grüße<br />
Sergej</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981628</guid><dc:creator><![CDATA[Sergey]]></dc:creator><pubDate>Mon, 30 Jan 2006 23:15:16 GMT</pubDate></item><item><title><![CDATA[Reply to und noch eine Frage zu Zeigern auf MemberFunktionen on Mon, 30 Jan 2006 22:57:13 GMT]]></title><description><![CDATA[<p>Sorry,<br />
Die Polymorphie steht dabei NICHT zur Verfügung!!!<br />
-----------------------------------------------------------------------------<br />
Ich habe endlich gefunden, wo &quot;Editieren&quot; eigener Beiträge steht. <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 />
Ich schäme mich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981631</guid><dc:creator><![CDATA[Sergey]]></dc:creator><pubDate>Mon, 30 Jan 2006 22:57:13 GMT</pubDate></item><item><title><![CDATA[Reply to und noch eine Frage zu Zeigern auf MemberFunktionen on Tue, 31 Jan 2006 03:58:06 GMT]]></title><description><![CDATA[<p>du könntest es so machen:</p>
<pre><code class="language-cpp">class CTask
{
  int (CTask::*RunFunc)();

  public:
  CTask (void *runFunc) : RunFunc(reinterpret_cast&lt;CTask::*()&gt;(runFunc) {}
  int Run () { return this-&gt;RunFunc(); }
};

class MyTask: public CTask
{
  int Run ();
  MyTask() : CTask(Run) {}
};
</code></pre>
<p>du mußt dann allerdings im konstruktor <strong>jeder</strong> task-klasse den funktionszeiger für Run() in der initialisierungsliste explizit angeben. ohne polymorphismus sehe ich leider keine möglichkeit, dies automatisch zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981683</guid><dc:creator><![CDATA[Konfusius]]></dc:creator><pubDate>Tue, 31 Jan 2006 03:58:06 GMT</pubDate></item></channel></rss>