funktion als parameter einer funktion

  • hallo!
    ich möchte in C++ eine methode erstellen, welche eine Funktion als Parameter übergeben bekommt. (Also ähnlich der glut methoden wie bspw. void glutDisplayFunc( void (*) (void) func )) nun habe ich bereits eine ähnliche methode erstellt und der compiler beschwert sich auch nicht, aber ich habe keine ahnung, wie ich aus meiner klasse die übergebene funktion aufrufe.

    was genau muss ich machen um die funktion auch benutzen zu können?

    ich habe nur einen pointer auf die übergebene funktion...wie kann ich den "einsetzen"?

    danke schon mal im voraus.:D

  • Einfach () dranhängen. Also zB:

    Code
    void hallo(void(*cb)(void)) {
      cb();
    }

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • danke erstmal!

    aber weißt du zufällig auch, wie ich die übergebene methode aus einer anderen methode heraus aufrufen kann? ich möchte die methode in einer art

    void init(void (*cb) (int))

    einmal aufrufen und dann als member meiner klasse verwenden, um sie dann aus einer anderen member methode heraus aufzurufen...

    ist das auch irgendwie möglich?

    EDIT: also was ich genau will: den pointer auf die methode einmal übergeben und dann aus meiner klasse heraus immer aufrufen wann ich will.

  • Ja sicher, du musst den pointer nur als Membervariable in der Klasse abspeichern.

    Allerdings musst du aufpassen, diese Technik funktioniert nur, wenn die Methode auf die das zeigt eine Klassemethode (d.h. mit static deklariert) ist!

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • kann ich dem pointer beim aufruf dann auch argumente mitgeben?

    immer wenn ich das versuche, erhalte ich einen error:
    error C2064: term does not evaluate to a function taking 2 arguments

    was eigentlich verständlich ist, da er ja zur compilezeit noch nicht weiß, auf welche methode er einmal zeigen wird. allerdings habe ich versucht, gleich bei der initialisierung des pointers auf eine statische methode: foo( int a, int b ) zu verweisen, welche einfach einen error ausgibt, falls sie aufgerufen wird. damit müsste der compiler doch die beiden argumente kennen, oder?:(

    ach ja und bezüglich statisch: es sind sowohl die methode die dem pointer eine methode zuweist, als auch die zugewiesene methode, als auch der pointer selbst statisch. einzig der aufrufer war dynamisch...hab das aber auch schon statisch getestet -> hat auch nicht funktioniert...

  • nein ich habe den code mittlerweile modifiziert. es wird eine funktion mit 2 parametern übergeben.

    leider bin ich der absolute c/c++ noob => keine ahnung von callbacks :(

    hier noch mein code:
    Definition:[INDENT] static void getCallback( void (*function) (int a, int b) );
    static void *externalFunction;
    [/INDENT]Initialisierung des Pointers:[INDENT] void (Class::*externalFunction)(int, int) = NULL; //hat vorher anders ausgesehen, aber das hab ich von einer tutorial seite.
    [/INDENT]Implementierung der Methoden:[INDENT] void Class::getCallback( void (*function) (int a, int b) )
    {[INDENT] externalFunction = &function; //<-- ab hier nimmt's der compiler nicht mehr
    [/INDENT]}
    void Class::caller()
    {[INDENT] int a = 5;
    int b = 4;
    externalFunction( a, b );
    [/INDENT]}
    [/INDENT]

  • Die Funktion ist schon ein Pointer, da brauchst das & nicht dazu.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Ach ja, falls dir das umständlich und komisch vorkommt: Da hast du recht, so macht man das nämlich in C++ normalerweise auch nicht.

    Normalerweise definiert man eine abstrakte Klasse, die nur eine Methode abstrakt drinnen hat, und jede Klasse die einen Callback haben will muss von der ableiten und diese Methode implementieren.

    Also zB:

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • hmmm...
    ich habe jetzt das problem, dass ich die implementierung der callback funktion in der main methode meines programms machen möchte. => ich kann von keiner klasse ableiten. gibt es dafür auch eine lösung?

    der aufrufer ist also in einer eigenen klasse. dort erfolgte vorhin auch die zuweisung zum pointer usw. .
    nur die funktionalität meines callbacks steht in main...

  • Du solltest main nicht von innerhalb des Programms aufrufen! Das führt fast garantiert zu einer Endlosschleife.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Du kannst in der Datei, wo sich main befindet, sehrwohl Klassen deklarieren.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!