Funktionszeiger



  • Hallo,

    ich habe ein kleines Problem mit Funktionszeigern:
    Wenn ich schreibe

    typedef void (*EventFunction)(uint);
    
    void test(uint _x) {
      MessageBox(...
    }
    
    class CButton : CComponent {
      CButton() {
        // ...
        this->OnClick = &test;
      }
      // ...
    };
    
    void CComponent::Memberfunktion {
      (*this->OnClick)(3);
    }
    

    dann klappt alles. Wenn ich aber test als Memberfunktion
    von CButton schreibe, dann sagt mein Compiler:

    Interface.h(49): error C2440: '=': 'void (__thiscall Editor::Interface::Menue::* )(uint)' kann nicht in 'EventFunction' konvertiert werden

    Der Konstruktor sieht so aus:

    CButton() {
      //...
      this->OnClick = &CButton::test;
    }
    

    Wie kann man das machen? 😕



  • Hallo,

    du willst einen Zeiger auf eine Elementfunktion. Dort hast du das Problem, dass
    noch der this-Zeiger implizit mitgefuehrt wird. Deine Deklaration muss wie folgt
    aussehen:

    void (CComponent::*ElemFunc)();
    

    mfg
    v R



  • Zunächst mal vielen Dank für die schnelle Antwort.

    Leider klappt das nicht 🙄 :

    Wenn ich schreibe

    this->OnClick = (CButton::*test)();
    

    , dann sagt mein VC++.NET-Compiler:

    Interface.h(49): error C2059: Syntaxfehler: '<tag>::*'

    Das mit dem "*" kann also nicht ganz richtig sein, auch wenn ich das schon auf anderen Websites gesehen habe.
    Ich habe auch probiert den * davorzuschreiben, dass geht genauso wenig.

    Habt ihr noch eine Idee?



  • Nabend,

    sry, aber ich glaub das ist nicht ganz ruebergekommen. Du machst ein Typedef:

    typedef void (CComponent::*ElemFunc)();
    

    Irgendwo in deiner Klasse steht z.B.:

    class X {
       private:
           ElemFunc onEvent;
    }
    

    In deinem CTor steht dann sowas:

    onEvent = &CComponent::Elementfunktion;
    

    Du benoetigst allerdings noch eine Instanz von CComponent, um die Element-
    funktion aufrufen zu koennen.

    mfg
    v R



  • Jetzt sagt er mir:

    Components.h(3): error C2645: Kein vollständiger Name für Elementzeiger ('::*' gefunden)

    Ich habe im prinztip das gemacht, was du gesagt hast:

    typedef void (SDLComponents::CComponent::*EventFunction)(uint);
    ...
    class CComponent {
      ...
      EventFunction OnClick;
    };
    ...
    class CButton : CComponent {
    public:
      CButton() {
        ...
        this->OnClick = &CButton::test;
      }
    
    };
    

    Ich vermute, dass das mit der Vererbung zusammenhängt.
    Außerdem ist da das Problem: Wo soll ich denn den typedef machen?
    Vor der Klassendefinition ist die Klasse nicht bekannt (fehlermeldung oben?), und nach der Klassendefinition ist es zu spät, weil die Klasse den Typ benötigt. 🙄
    Was nun?



  • hm, und wenn Du das direkt so schreibst?

    class CComponent {
      ..
      typedef void (SDLComponents::CComponent::*EventFunction)(uint);
      ...
      EventFunction OnClick;
    };
    ...
    class CButton : CComponent {
    public:
      CButton() {
        ...
        this->OnClick = &CButton::test;
      }
    
    };
    

Anmelden zum Antworten