Funktionspointer



  • Hi,
    ich habe ein problem mit funktionspointern!

    klasse tree:

    template <class T> class TREE
    {
      TREENODE<T> *root;
    
      int del (T wert, TREENODE<T> **wurzel);   // interne del für del (T wert)
      int ins (T wert, TREENODE<T> *wurzel);     // interne ins für ins (T wert)
      void preorder (void (*func) (T wert), TREENODE<T> *pos);    // intern
      void inorder (void (*func) (T wert), TREENODE<T> *pos);     // intern
      void postorder (void (*func) (T wert), TREENODE<T> *pos);   // intern
    
    public:
      TREE (void);
      ~TREE (void);
      void ins (T wert);
      void del (T wert);
      int search (T wert);
      int empty (void);
      void preorder (void (*func) (T wert));  // Wurzel, linker Baum, rechter Baum
      void inorder (void (*func) (T wert));   // linker Baum, Wurzel, rechter Baum
      void postorder (void (*func) (T wert)); // linker Baum, rechter Baum, Wurzel
    };
    

    der aufruf im destruktor:

    template <class T> TREE<T> :: ~TREE (void)
    {
      postorder (del);
    }
    

    leider geht das net 😞 ich bekomme immer die fehlermeldung "[C++ Fehler] bintree.h(61): E2285 Keine Übereinstimmung für 'TREE<int>::postorder(int (TREE<int>::*)(int,TREENODE<int> * *))' gefunden."



  • du musst den Klassennamen mit angeben:

    typedef void (TREE<t>::*funktion)(T);
    void postorder ( funktion f )
    {
       T wert = ...
       ...
      (this->*f)( wert );
    }
    


  • EDIT: war quatsch



  • Mit der oben vorgeschlagenen Lösung könntest du aber auch nur Funktionen übergeben, die Member der Klasse TREE (oder einer abgeleiteten Klasse) sind. Ich würde aus den Funktionen mit Callbacks zumindest Templates machen, die einen Funktor annehmen, und dann mit boost::bind o.Ä. die del-Methode von this übergeben.


Anmelden zum Antworten