<?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[Problem bei Zeiger auf Memberfunktion]]></title><description><![CDATA[<p>Hall Leute!<br />
Ich habe ein Problem bei einem Zeiger der auf eine Memberfunktion zeigen soll.</p>
<pre><code class="language-cpp">class CD3dstuff
{
public:
CD3dstuff();

//...
private:
class cProcessManager
{
  // A structure that stores a function pointer and linked list
  typedef struct sProcess {
    void  (*Function)();
    sProcess *Next;
  } sProcess;

  protected:
    sProcess *m_ProcessParent; // The top state in the stack
                               // (the head of the stack)

  public:
    cProcessManager() { m_ProcessParent = NULL; }
    ~cProcessManager() 
    {
      sProcess *ProcessPtr;

      // Remove all processes from the stack
      while((ProcessPtr = m_ProcessParent) != NULL) {
        m_ProcessParent = ProcessPtr-&gt;Next;
        delete ProcessPtr;
      }
    }

    // Add function on to the stack
    void Add(void (*Process)())
    {
      // Don't push a NULL value
      if(Process != NULL) {
        // Allocate a new process and push it on stack
        sProcess *ProcessPtr = new sProcess;
        ProcessPtr-&gt;Next = m_ProcessParent;
        m_ProcessParent = ProcessPtr;
        ProcessPtr-&gt;Function = Process;
      }
    }

    // Process all functions
    void Process()
    { 
      sProcess *ProcessPtr = m_ProcessParent;
      while(ProcessPtr != NULL) {
        ProcessPtr-&gt;Function();
        ProcessPtr = ProcessPtr-&gt;Next;
      }
    }
};  // Ende von cProcessManager

void CD_vSetAlpha(); // Funktion die an den Process Manager übergeben werden soll

//...
};
</code></pre>
<pre><code class="language-cpp">CD3dstuff::CD3dstuff()
{
	cProcessManager InitMan,CleanUpMan;
	InitMan.Add(&amp;CD3dstuff::CD_vSetAlpha);
	InitMan.Process();
}
</code></pre>
<p>Ich erhalte dann den Fehler:<br />
error C2664: 'CD3dstuff::cProcessManager::Add' : cannot convert parameter 1 from 'void (__thiscall CD3dstuff::* )(void)' to 'void (__cdecl *)(void)'<br />
There is no context in which this conversion is possible</p>
<p>Und ich habe keine Ahnung wo genau der Fehler liegt...<br />
Ich habe auch ein bischen herumprobiert:</p>
<pre><code class="language-cpp">InitMan.Add(CD_vSetAlpha); //error C3867: 'CD3dstuff::CD_vSetAlpha': function call missing argument list;
// use '&amp;CD3dstuff::CD_vSetAlpha' to create a pointer to member
InitMan.Add(this-&gt;CD_vSetAlpha); //error C2664: 'CD3dstuff::cProcessManager::Add' :
// cannot convert parameter 1 from 'void' to 'void (__cdecl *)(void)'
</code></pre>
<p>und noch einige mehr. Diese haben aber alle nicht funktioniert. <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/topic/166670/problem-bei-zeiger-auf-memberfunktion</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 11:49:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/166670.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Dec 2006 12:03:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem bei Zeiger auf Memberfunktion on Fri, 01 Dec 2006 12:03:29 GMT]]></title><description><![CDATA[<p>Hall Leute!<br />
Ich habe ein Problem bei einem Zeiger der auf eine Memberfunktion zeigen soll.</p>
<pre><code class="language-cpp">class CD3dstuff
{
public:
CD3dstuff();

//...
private:
class cProcessManager
{
  // A structure that stores a function pointer and linked list
  typedef struct sProcess {
    void  (*Function)();
    sProcess *Next;
  } sProcess;

  protected:
    sProcess *m_ProcessParent; // The top state in the stack
                               // (the head of the stack)

  public:
    cProcessManager() { m_ProcessParent = NULL; }
    ~cProcessManager() 
    {
      sProcess *ProcessPtr;

      // Remove all processes from the stack
      while((ProcessPtr = m_ProcessParent) != NULL) {
        m_ProcessParent = ProcessPtr-&gt;Next;
        delete ProcessPtr;
      }
    }

    // Add function on to the stack
    void Add(void (*Process)())
    {
      // Don't push a NULL value
      if(Process != NULL) {
        // Allocate a new process and push it on stack
        sProcess *ProcessPtr = new sProcess;
        ProcessPtr-&gt;Next = m_ProcessParent;
        m_ProcessParent = ProcessPtr;
        ProcessPtr-&gt;Function = Process;
      }
    }

    // Process all functions
    void Process()
    { 
      sProcess *ProcessPtr = m_ProcessParent;
      while(ProcessPtr != NULL) {
        ProcessPtr-&gt;Function();
        ProcessPtr = ProcessPtr-&gt;Next;
      }
    }
};  // Ende von cProcessManager

void CD_vSetAlpha(); // Funktion die an den Process Manager übergeben werden soll

//...
};
</code></pre>
<pre><code class="language-cpp">CD3dstuff::CD3dstuff()
{
	cProcessManager InitMan,CleanUpMan;
	InitMan.Add(&amp;CD3dstuff::CD_vSetAlpha);
	InitMan.Process();
}
</code></pre>
<p>Ich erhalte dann den Fehler:<br />
error C2664: 'CD3dstuff::cProcessManager::Add' : cannot convert parameter 1 from 'void (__thiscall CD3dstuff::* )(void)' to 'void (__cdecl *)(void)'<br />
There is no context in which this conversion is possible</p>
<p>Und ich habe keine Ahnung wo genau der Fehler liegt...<br />
Ich habe auch ein bischen herumprobiert:</p>
<pre><code class="language-cpp">InitMan.Add(CD_vSetAlpha); //error C3867: 'CD3dstuff::CD_vSetAlpha': function call missing argument list;
// use '&amp;CD3dstuff::CD_vSetAlpha' to create a pointer to member
InitMan.Add(this-&gt;CD_vSetAlpha); //error C2664: 'CD3dstuff::cProcessManager::Add' :
// cannot convert parameter 1 from 'void' to 'void (__cdecl *)(void)'
</code></pre>
<p>und noch einige mehr. Diese haben aber alle nicht funktioniert. <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/1185245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1185245</guid><dc:creator><![CDATA[Airmack]]></dc:creator><pubDate>Fri, 01 Dec 2006 12:03:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Zeiger auf Memberfunktion on Fri, 01 Dec 2006 12:14:15 GMT]]></title><description><![CDATA[<p>Du kannst eine Methode nicht in einem 'normalen' Funktionszeiger unterbringen, dazu benötigst du einen Methodenzeiger. (der weiß im Gegensatz zum Funktionszeiger, daß er ein this-Objekt benötigt und wie er es übergeben kann)</p>
<pre><code class="language-cpp">typedef struct sProcess {
    void  (C3Ddstuff::*Function)();
    sProcess *Next;
} sProcess;

void Add(void(C3Ddstuff::*Process)())
{...}
</code></pre>
<p>Alterantiv könntest du mit statischen Methoden arbeiten und dir das &quot;this&quot;-Objekt von woanders besorgen.</p>
<p>PS: <code>typedef struct {...} name;</code> war vielleicht unter C notwendig. In C++ sieht das nur noch seltsam aus, bringt aber überhaupt nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1185257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1185257</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 01 Dec 2006 12:14:15 GMT</pubDate></item></channel></rss>