Funktionen als Parameter übergeben
-
HI,
ich würde gerne in einem binärbaum bei der postorder, preorder und inorder funktion eine weitere funktion als parameter übergeben.
Frage wie geht das? ich habe versucht den syntax im inet zu finden aber leider hat das net geklappt!Funktion1 (Funktion2 (parameter1, 2, ...), parameter1, 2,..)
irgendwie sowas .. nur wie das genaun geht. also am coolsten wär es wenn ihr mir direkt die deklaration und den aufruf als code geben könntet !
danke schon mal !
-
-
cool danke für die schnelle antwort !
-
Du kannst Funktionen z.B. als Pointer übergeben (und als Referenzen, aber da bin ich nicht sicher wie's geht ;)) Ich machs mal anhand eines Beispieles:
// Diese Funktion soll übergeben werden: int foo(double, char*); // Machen wir erstmal ein typedef, damits einfacher wird: typedef int fptr(double, char*); // damit können wir die Funktion, der foo übergeben wird, deklarieren: void bar(fptr *f); // witzigerweise geht auch void bar(fptr f); aber frag mich nicht wieso // Aufruf: bar(foo);
oder das ganze ohne typedef:
void bar(int (*f)(double, char*));
-
jo sauber hat gefunzt !
-
aber der name des typedefs ist wohl etwa unangebracht. wenn da ptr drin vorkommt, sollte das auch ein pointer sein. viele machen den pointer da auch gleich mit rein. ich find das so allerdings auch verstaendlicher, nur eben das ptr da weg. stattdessen FooFunc oder so nennen.
-
hmm schitt warumn geht das nun wieder net
template <class T> TREE<T> :: ~TREE (void)
{
void (*pt2del) (T wert);
pt2del = &TREE<T> :: del;
postorder (del());
}in der zeile in der ich die funktion dem pointer zuweise sagt mir der compieler immer
[C++ Fehler] bintree.h(60): E2034 Konvertierung von 'void (TREE<int>::)(int)' nach 'void ()(int)' nicht möglich.ich sehe da leider keinen unterschied und weis deshalb auch net warum er mir den fehler sagt !
-
del ist eine nicht-statische Memberfunktion, darauf kannst du nur Memberzeiger zeigen lassen, keine normalen Funktionszeiger.
Rein syntaktisch gesehen gibt es 2 Lösungen:
1. del-Methode static machen
2. statt eines normalen Funktionszeigers einen Memberzeiger nehmen:void (TREE<T>::* pt2del)(T wert) = &TREE<T>::del; // ..
Da ich deine Klasse nicht kenne, weiß ich nicht, welche davon geeigneter wäre. Hängt z.B. davon ab, ob TREE eine Kapselung des Baumkonzeptes darstellt, oder ob TREE ein Baum, dh ein Knoten mit einer Menge von Unterbäumen, ist.
-
habe die zweite methode genommen!
hat gefunzt!danke für die schnelle antwort!