problemlä mit funktions-zeiger in klasse



  • hi leutz, hab ma wieda a probläm...

    also follgender code geht nicht.

    class T {
      void (*pointer)();
      void standard();
     public:
      void set(void (*new_h)()) {
        pointer = new_h;
      }
      T() {
        pointer = standard;  //fehler
        set(standard);	 //fehler
      }
    };
    
    void test() {
     // bla bla
    }
    
    int main() {
      T a;
      a.set(test);		 //dat geht
      return 0;
    }
    

    also, wenn ich meinem pointer im konstruktor die standard- funktion zuweisen will, kommen paar fehler meldungen.

    last.cpp: In constructor ‘T::T()’:
    last.cpp:9: error: argument of type ‘void (T::)()’ does not match ‘void (*)()’
    last.cpp:10: error: no matching function for call to ‘T::set(<unresolved overloaded function type>)’
    last.cpp:5: note: candidates are: void T::set(void (*)())
    

    und kennt jemand eine möglichkeit das doch so hinzubiegen das es klappt?



  • Du versuchst im Moment einem Funktionszeiger eine Methode zuzuweisen. Das geht nicht, wie Du schon festgestellt hast.

    Möglichkeit 1. Du weist einem Methodenzeiger die Methode zu.

    void (T::*pointer)();
    void standard();
    T() {
        pointer = &T::standard;
    }
    

    Möglichkeit 2. Du weist dem Funktionszeiger eine Funktion zu.

    void (*pointer)();
    static void standard();
    T() {
        pointer = &T::standard;
    }
    


  • dann ist das doch aber ein globals ding. und das sieht (finde ich jetzt) nicht so geil aus. weil die funktionszeiger sollten schon zur klasse gehöhren.



  • Hm, ich dachte das wäre klar dass das in eine Klasse T gehört 😉

    class T {
        void (T::*pointer)();
        void standard();
    public:
        T() {
            pointer = &T::standard;
        }
    };
    

    Zweites Beispiel analog.



  • ups hab mich nur verkuckt wie du das meintest. 🙄
    aber vielen dnak für die hilfe. jetzt läuft es wie geschmiert. habe aber deine zweite möglichkeit nehmen müssen (das mit dem static void standard()) weil ich mit der anderen möglichkeit keine fremdfunktionen also welche die nicht zu class T gehören zuweisen konnte.
    thx nochmal 👍



  • Ich will die zweite Variante benutzen, aber ich bekomme den Fehler:

    argument of type `void (T::)()' does not match `void (T::*)()'

    Wie erstellt man denn eine Variable vom Typ "void (T::)()" bzw. "void (T::*)()"?

    class Spiel {
      private:
        void (Spiel::aktStatusFunktion)();
      public:
        Spiel() {aktStatusFunktion=ersteFunktion;};
        virtual void ersteFunktion() {//bla};  //wird vom Constructor aufgerufen.
    };
    

    wenn ich

    void (Spiel::aktStatusFunktion)();
    

    schreibe kommt

    invalid use of member (did you forget the `&' ?)

    Wenn ich dann ein '&' ergänze:

    ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say `&Spiel::ersteFunktion'

    Static kann ich die Funktion nicht machen, weil sie gleichzeitig virtual ist.



  • Da fehlt ein * nach dem Spiel:: (siehe mein Beispiel).



  • Ne,ne, Nee:

    argument of type `void (Spiel::)()' does not match `void (Spiel::*)()'
    

    Das kommt bei

    LordJaxom schrieb:

    Möglichkeit 1. Du weist einem Methodenzeiger die Methode zu.
    C/C++ Code:
    void (T::*pointer)();
    void standard();
    T() {
    pointer = &T::standard;
    }
    C/C++ Code:
    void (T::*pointer)();
    void standard();
    T() {
    pointer = &T::standard;
    }
    C/C++ Code:
    void (T::*pointer)();
    void standard();
    T() {
    pointer = &T::standard;
    }

    das andere geht nur mit statik (oder?)
    Ich probiere es später aus. Ich hab jetzt keine Zeit.



  • obbba schrieb:

    private:
        void (Spiel::aktStatusFunktion)();
    

    Doch, hier fehlt ein Sternchen 😉

    Und direkt drunter müssen Adressoperator und Klassenname dazu:

    public:
        Spiel() {aktStatusFunktion=&Spiel::ersteFunktion;};
    


  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten