Gå til innhold

function pointer til Member


Anbefalte innlegg

Jeg holder med et windows program og jeg prøver et system der alle taster har en function pointer, slik at når tasten trykkes ned kjører funksjonen, dette fungere greit så lenge jeg programmer i uten klasse og medlems funksjonen. Men når jeg bruker pointer til member function må jeg som kjent forandre litt på koden til fks. void (klasse::*pFunc) (int, int);

 

Det jeg lurer på er om det er mulig å lage en function pointer som går til alle klasse eller mange klasser?.

 

litt info:

jeg bruker ms vs 7.0

Lenke til kommentar
Videoannonse
Annonse

Hvis jeg forstår deg riktig så er det mulig at Boost::Function gjør det du trenger. Med den kan du definere en funksjons-peker som du kan 'binde' til hvilken som medlemsfunksjon som passer til funksjons signaturen boost::function objektet er definert med.

 

test1 t1;
test2 t2;

boost::function<void(int, int)> fptr;

fptr=boost::bind(&test1::funksjon, &t1, _1, _2);

fptr(1, 2);

fptr=boost::bind(&test2::funksjon, &t2, _1, _2);

fptr(1, 2);

Lenke til kommentar

hmm.... jeg har sett på Boost å den ser ut til å være det jeg var på jakt etter, men samtidig fjerner den seg litt for mye fra C++ , jeg var mere på jakt etter en mere naturlig måte å løse problemet på.

Så jeg kikket mere på søppel sitt inlegg, men det forutsetter av jeg har en klasse som er foreldre til alle klassene jeg vil kalle en funsjon fra (hvis jeg har skjønt hvordan det funker ;) ) og det vil bli litt rart at jeg må lage en "tom" klasse som skal være med på en rekke klassen bare for å være der.

finnes de ingen annen utvei?

Lenke til kommentar

På hvilken måte fjerner Boost seg fra C++? Hvis du skal jobbe effektivt i C++ er du nødt til å venne deg til å bruke biblioteker, i så måte kunne du gjort langt verre valg enn Boost. Så vidt jeg vet vil deler av Boost ende opp i standardbiblioteket.

 

En alternativ løsning hvor du også slipper å bekymre deg om polymorfi er Loki::Functor:

Loki::Functor<void, TYPELIST_2(int, int)> f(&foo, &Foo::bar);

Denne kan du lagre et sted, og kalle som en funksjon (www.sf.net/projects/loki-lib).

Lenke til kommentar

Les hele kodesnutten/artikkelen, Giddion!

 

For å sitere: "..Dette gjør blandt annet at objekter som blir sendt inn til printType2 ikke lenger er nødt til å være en subtype av A .."

 

..og her er en kodesnutt som illustrerer det i "isolasjon":

#include <iostream>

using namespace std;


class A {
public:
void doStuff()
{
 cout << "A::doStuff" << endl;
} // doStuff
}; // A


class B {
public:
void doStuff()
{
 cout << "B::doStuff" << endl;
} // doStuff
}; // B


template<typename T>
class KeyHandler {
public:
KeyHandler(T& obj_)
 :_obj(obj_)
{
} // constructor

typedef void (T::*Func)(int, int);

void doStuff()
{
 _obj.doStuff();
} // doStuff


private:
T& _obj;	
}; // KeyHandler


int main()
{


A a;
B b;
KeyHandler<A> kh_a(a);
KeyHandler<B> kh_b(b);

kh_a.doStuff();
kh_b.doStuff();
return(0);
} // main

 

Er ellers enig i det A_N_K sier; Boost er det lurt å sette seg inn i.

 

Edit:

Jeg har svart på dette spørsmålet:

Det jeg lurer på er om det er mulig å lage en function pointer som går til alle klasse eller mange klasser?.

 

Det du nevnte ovenfor den setningen ble for utydlig; så om du skal ha et mer spesifikt svar må du spørre igjen. :}

 

 

Edit2:

Her er en kodesnutt til (den første var kanskje ikke det du var ute etter - og jeg begynner å bli grisetrøtt her ..):

 

#include <iostream>

using namespace std;


class A {
public:
void doStuff()
{
 cout << "A::doStuff" << endl;
} // doStuff
}; // A


class B {
public:
void doStuff()
{
 cout << "B::doStuff" << endl;
} // doStuff

void doSomeOtherStuff()
{
 cout << "B::doSomeOtherStuff" << endl;
} // doSomeOtherStuff
}; // B


template<typename T>
class KeyHandler {
public:
typedef void (T::*Func)();

KeyHandler(T& obj_, Func func_)
 :_obj(obj_),
  _func(func_)
{
} // constructor


void operator()()
{
 (_obj.*_func)();
} // operator()



private:
T& _obj;
Func _func;
}; // KeyHandler


int main()
{


A a;
B b;
KeyHandler<A> kh_a(a, &A::doStuff);
KeyHandler<B> kh_b(b, &B::doSomeOtherStuff);

kh_a();
kh_b();
return(0);
} // main

 

..til slutt ender du opp med boost::function ....

Endret av søppel
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...