Giddion Skrevet 17. juni 2004 Del Skrevet 17. juni 2004 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
negativecreep Skrevet 17. juni 2004 Del Skrevet 17. juni 2004 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
søppel Skrevet 21. juni 2004 Del Skrevet 21. juni 2004 Det jeg lurer på er om det er mulig å lage en function pointer som går til alle klasse eller mange klasser?. Ja, bruk polyformi. Sjekk Kodesnutter-tråden, der er det en post som demonstrerer vanlig polyformi og litt til. Lenke til kommentar
Giddion Skrevet 22. juni 2004 Forfatter Del Skrevet 22. juni 2004 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
A_N_K Skrevet 22. juni 2004 Del Skrevet 22. juni 2004 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
søppel Skrevet 22. juni 2004 Del Skrevet 22. juni 2004 (endret) 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 22. juni 2004 av søppel Lenke til kommentar
saboi Skrevet 22. juni 2004 Del Skrevet 22. juni 2004 boost er omtrent så standard som et ikke-standard-bibliotek kan få blitt Lenke til kommentar
A_N_K Skrevet 22. juni 2004 Del Skrevet 22. juni 2004 Det idiomatiske innenfor C++ ville være å mappe funktorer (boost::function, Loki::Functor) til events (i ditt tilfelle tastetrykk), vanlige callbacks funker dårlig hvis du skal kalle objekter. Lenke til kommentar
GeirGrusom Skrevet 23. juni 2004 Del Skrevet 23. juni 2004 Er ikke pointer-to-member enklere? Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå