1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

funktion als parameter einer funktion

  • Mokka
  • 30. April 2007 um 12:51
  • Unerledigt
  • Mokka
    3
    Mokka
    Mitglied
    Punkte
    45
    Beiträge
    8
    • 30. April 2007 um 12:51
    • #1

    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

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 30. April 2007 um 12:56
    • #2

    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!

  • Mokka
    3
    Mokka
    Mitglied
    Punkte
    45
    Beiträge
    8
    • 30. April 2007 um 13:19
    • #3

    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.

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 30. April 2007 um 14:12
    • #4

    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!

  • Mokka
    3
    Mokka
    Mitglied
    Punkte
    45
    Beiträge
    8
    • 30. April 2007 um 15:15
    • #5

    hey DANKE!

  • Mokka
    3
    Mokka
    Mitglied
    Punkte
    45
    Beiträge
    8
    • 30. April 2007 um 21:08
    • #6

    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...

  • lerod
    13
    lerod
    Mitglied
    Reaktionen
    5
    Punkte
    1.620
    Beiträge
    315
    • 30. April 2007 um 22:05
    • #7

    Du verwendest deine Definition ...

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



    und willst anschließend auf eine statische Funktion mit 2 Parameter verweisen?

  • Mokka
    3
    Mokka
    Mitglied
    Punkte
    45
    Beiträge
    8
    • 30. April 2007 um 22:15
    • #8

    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 :frowning_face:

    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]

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 30. April 2007 um 22:44
    • #9

    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!

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 30. April 2007 um 22:49
    • #10

    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:

    Code
    class MyClassCallback {
    public:
      void gotCallback(int a, int b)=0;
    };
    
    
    class MyClass {
      MyClassCallback *cb;
      void setCallback(MyClassCallback *_cb) {
        cb = _cb;
      }
      void caller() {
        if(cb)
          cb->gotCallback(1,2);
      }
    };
    
    
    class Test : public MyClassCallback {
      void run() {
        MyClass c;
        c.setCallback(this);
        c.caller();
      }
      void gotCallback(int a, int b) {
        std::cout << "a = " << a << ", b = " << b << std::endl;
      }
    };
    Alles anzeigen

    [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!

  • Mokka
    3
    Mokka
    Mitglied
    Punkte
    45
    Beiträge
    8
    • 30. April 2007 um 22:54
    • #11

    nochmal danke, ich versuch's auf deine weise.:thumb: wie gesagt ich hab null plan was callbacks betrifft.

  • Mokka
    3
    Mokka
    Mitglied
    Punkte
    45
    Beiträge
    8
    • 30. April 2007 um 23:26
    • #12

    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...

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 30. April 2007 um 23:38
    • #13

    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!

  • Mokka
    3
    Mokka
    Mitglied
    Punkte
    45
    Beiträge
    8
    • 1. Mai 2007 um 00:24
    • #14

    sorry habe mich geirrt. ich implementiere die methode lediglich im gleichen file wie main() nicht jedoch in der methode.

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 1. Mai 2007 um 00:35
    • #15

    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!

  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern