Avatar billede rrm Nybegynder
29. november 2005 - 13:13 Der er 9 kommentarer og
1 løsning

Lave CallBack til en klasse funktion

Er det mulig at lave en callback til en funktion i en klasse? Noget ala

class test {
void fisk();
}

callback funktion (t: test)
callTest(&t.fisk)
Avatar billede bertelbrander Novice
29. november 2005 - 20:00 #1
Ja og nej.

Hvis fisk er en static function i test:
#include <iostream>

typedef void (*FuncPtrT)(void);
class test
{
public:
  static void fisk()
  {
      std::cout << "Hello Fisk" << std::endl;
  }
};

void Func(FuncPtrT fptr)
{
  fptr();
}

int main()
{
  Func(test::fisk);
}

Hvis ikke fisk er static, bliver vi nødt til at vide hvilket object der skal bruges i kaldet til fisk, f.ex:

Det kan f.ex. se sådan ud:
#include <iostream>

typedef void (*FuncPtrT)(void);

class test
{
public:
  test() : S("Hello Fisk") {}
  static void CallFisk(test *t)
  {
      t->fisk();
  }

  void fisk()
  {
      std::cout << S << std::endl;
  }
private:
  std::string S;
};

int main()
{
  test T;
  test::CallFisk(&T);
}

Hvis du fortalte hvad du vil opnå er det muligt at vi kan komme med en bedre løsning.
Avatar billede rrm Nybegynder
29. november 2005 - 20:35 #2
ok, jeg har besluttet at bruge MidiShare bibliotek til at klare noget timming arbejde.

Vi ønsker at kunne bruge (her vist som pascal kode, http://midishare.sourceforge.net/doc/index.html):

typedef pascal void (* TaskPtr)( long date, short refNum, long a1,long a2,long a3 );

pascal MidiEvPtr MidiTask (TaskPtr MyProc, long date, short refNum, long a1, long a2,long a3);

noget ala (hentet fra deres side)

myTask = MidiTask(Action,MidiGetTime()+1000,myRefNum, a1, a2, a3);

hvor action er t's fisk funktion. Er det mulig?
Avatar billede bertelbrander Novice
29. november 2005 - 20:42 #3
Det kan man godt, hvis funktionen er static. Men en static funcktion kender ikke noget object, så den kan kun tilgå andre static funktioner og variable i class'en.

Hvis en af parametrene (a1 til a3) er ledige kunne man caste denne til objectet og tilbage.

Dvs noget i stil med:
test t;
myTask = MidiTask(CallFisk,MidiGetTime()+1000,myRefNum, (long)&t, a2, a3);

Og så:
void Test::CallFisk(long date, short refNum, long a1,long a2,long a3 )
{
  test *t = (test *)a1;
  t->fisk();
}
Avatar billede rrm Nybegynder
29. november 2005 - 20:49 #4
Er der en anden måde du vil forslå at det bliver gjort på?? Brug af normal funktioner eller?
Avatar billede bertelbrander Novice
29. november 2005 - 21:02 #5
Har jeg ret i at a1 til a3 kun bliver brugt til at overføre parametre til callback funktionen?

Jeg tror ikke der er så mange andre muligheder. Om CallFisk skal være en member i class'en eller ikke er mest et spørgsmål om smag og behag.
Avatar billede rrm Nybegynder
29. november 2005 - 21:42 #6
ifølge dokumentationen er a1,a2,a3 til at overfører parametere med...
Avatar billede rrm Nybegynder
29. november 2005 - 21:45 #7
men vil lige se lidt på det og så vender jeg tilbage....
Avatar billede rrm Nybegynder
03. december 2005 - 20:11 #8
tak for hjælpen, vil du ligge et svar??
Avatar billede bertelbrander Novice
10. december 2005 - 17:51 #9
Jeg samler ikke på point.
Avatar billede rrm Nybegynder
10. december 2005 - 19:35 #10
ok...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester