Zeiger auf Memberfunktionen



  • Eins vorweg: Auch wenn es erstmal so ausschaut: Die Frage hat nichts mit der WinAPI zu tun! Okay, ich versuche mal ganz vorne anzufangen. Ich schreibe gerade an einer Engine (auch wenn ich im Moment nicht wirklich weit damit gekommen bin) und arbeite gerade an einem Message-Verarbeitungssystem. Alle Klassen meiner Engine sind von einer Basisklasse namens LLClass abgeleitet. Unter anderem auch (über mehrere Umwege 😉 ) LLMainWnd und LLMyApp. Das Ziel des ganzen ist es, dass Mausklick-Events, die LLMainWnd über eine Funktion namens OnLButtonUp empfängt, an die Funktion weitergeleitet werden, auf die der Zeiger pOnLButtonDown zeigt. Das ganze ist schon in LLComponent (irgendwo zwischen LLClass und LLMainWnd) vorbereitet:

    class LLComponent : public LLClass { [...]
    public:
      LRESULT (LLApp::*pOnLButtonUp)(WORD, WORD, DWORD);
      [...]
    protected:
      LRESULT OnLButtonUp(WORD wX, WORD wY, DWORD dwFlags);
      [...]
    }
    

    Das LLApp:: hab ich schon eingefügt, weil das an anderer Stelle im Netz (http://www.desktopsuche.de/dks803/19891.shtml) empfohlen wurde. Doch hat das auch nichts gebracht, denn jetzt kriege ich die (etwas seltsame) Meldung:

    dx\llib.cpp(55) : error C2440: '=' : 'long (__thiscall MyApp::)(unsigned short,unsigned short,unsigned long)' kann nicht in 'long (__thiscall LLApp::)(unsigned short,unsigned short,unsigned l
    ong)' konvertiert werden

    Die Zeile, in der dieser Fehler auftaucht ist:

    m_MainWnd.pOnLButtonUp = this->OnMainWndLBtnUp;
    

    wobei das this-> nichts bringt... OnMainWndLBtnDown ist einfach eine Memberfunktion von LLMyApp (abgeleitet von LLApp), die ansonsten aber genauso aussieht, wie LLComponent::OnLButtonUp.

    Mein zweites Problem ist die Standardimplementation von OnLButtonUp (und allen anderen Handlern natürlich auch):

    LRESULT LLComponent::OnLButtonUp(WORD wX, WORD wY, DWORD dwFlags)
    {
    	if(pOnLButtonUp != NULL)
    		return pOnLButtonUp(wX, wY, dwFlags);
    
    	return -1;
    }
    

    Dazu meldet mein Compiler nur trocken:

    dx\component.cpp(121) : error C2064: Ausdruck ergibt keine Funktion

    Also, wer jetzt noch immer nicht aufgegeben hat (kann mich einfach nicht kurz fassen!) und zuviel Zeit hat: BITTE HILF MIR!!! 🙄
    Lino



  • Lino schrieb:

    Eins vorweg: Auch wenn es erstmal so ausschaut: Die Frage hat nichts mit der WinAPI zu tun! Okay, ich versuche mal ganz vorne anzufangen. Ich schreibe gerade an einer Engine (auch wenn ich im Moment nicht wirklich weit damit gekommen bin) und arbeite gerade an einem Message-Verarbeitungssystem. Alle Klassen meiner Engine sind von einer Basisklasse namens LLClass abgeleitet. Unter anderem auch (über mehrere Umwege 😉 ) LLMainWnd und LLMyApp. Das Ziel des ganzen ist es, dass Mausklick-Events, die LLMainWnd über eine Funktion namens OnLButtonUp empfängt, an die Funktion weitergeleitet werden, auf die der Zeiger pOnLButtonDown zeigt. Das ganze ist schon in LLComponent (irgendwo zwischen LLClass und LLMainWnd) vorbereitet:

    class LLComponent : public LLClass { [...]
    public:
      LRESULT (LLApp::*pOnLButtonUp)(WORD, WORD, DWORD);
      [...]
    protected:
      LRESULT OnLButtonUp(WORD wX, WORD wY, DWORD dwFlags);
      [...]
    }
    

    Das LLApp:: hab ich schon eingefügt, weil das an anderer Stelle im Netz (http://www.desktopsuche.de/dks803/19891.shtml) empfohlen wurde. Doch hat das auch nichts gebracht, denn jetzt kriege ich die (etwas seltsame) Meldung:

    dx\llib.cpp(55) : error C2440: '=' : 'long (__thiscall MyApp::)(unsigned short,unsigned short,unsigned long)' kann nicht in 'long (__thiscall LLApp::)(unsigned short,unsigned short,unsigned l
    ong)' konvertiert werden

    Die Zeile, in der dieser Fehler auftaucht ist:

    m_MainWnd.pOnLButtonUp = this->OnMainWndLBtnUp;
    

    Es muss hier &LLApp::OnMainWndLBtnUp heissen.

    wobei das this-> nichts bringt... OnMainWndLBtnDown ist einfach eine Memberfunktion von LLMyApp (abgeleitet von LLApp), die ansonsten aber genauso aussieht, wie LLComponent::OnLButtonUp.

    Mein zweites Problem ist die Standardimplementation von OnLButtonUp (und allen anderen Handlern natürlich auch):

    LRESULT LLComponent::OnLButtonUp(WORD wX, WORD wY, DWORD dwFlags)
    {
    	if(pOnLButtonUp != NULL)
    		return pOnLButtonUp(wX, wY, dwFlags);
    
    	return -1;
    }
    

    Dazu meldet mein Compiler nur trocken:

    dx\component.cpp(121) : error C2064: Ausdruck ergibt keine Funktion

    Das liegt daran, dass du den Zeiger erst einmal dereferenzieren musst, damit
    du an den Inhalt kommst:

    //...
    return (*pOnLButtonUp)(wX, wY, dwFlags);
    

    mfg
    v R



  • Warum packst du das ganze nicht in einen Namespace?

    namespace ll {
      class object  // former LLCLass {
    
      };
    
      class component : public object {
    
      };
    }
    

    Wär doch viel ordentlicher.


Anmelden zum Antworten