Buby Temat założony przez niniejszego użytkownika |
Funkcja przyjmująca jako argument wskaźnik na dowolną funkcję » 2015-02-22 16:36:21 Witam, wiem, że dla wielu, to pytanie jest trywialne, ale kto pyta ten nie błądzi, więc proszę o pomoc. Mój problem wygląda następująco - postanowiłem sobie napisać klasę o nazwie przycisk. Wszystko szło jak po maśle, jednak, gdy chciałem zaimplementować sobie przysłowiowego "OnClicka" napotkałem mały problem. Jak przekazać do funkcji uniwersalny wskaźnik, który obsłuży mi funkcje z różną liczbą argumentów? Czytałem na temat wskaźników do funkcji, ba nawet potrafię sobie ot taki stworzyć, nawet nie chodzi mi tutaj o typ, tylko o argumenty - jeśli przykładowo stworzę moją funkcję i jej definicja wygląda tak: void Przycisk::Klikniecie( void * Funkcja ) { Funkcja(); }
I teraz, jako argument chcę przekazać moją funkcję, która przyjmuje jakieś argumenty, a skoro jest to OnKlick, to nie mam pojęcia, jaką funkcję akurat przyjdzie mi wykonać. W jaki sposób to zaimplementować? Poda ktoś jakieś wskazówki? Bo przykładowo, jeśli w tej sytuacji poślę do funkcji jako argument coś takiego. void ZmienEtykietePrzycisku( std::string Etykieta ) { }
... NazwaObiektu.Klikniecie( ZmienEtykietePrzycisku ); To przecież nie jestem w stanie podać mu argumentów, bo przekazuje tylko adres... W jaki sposób można napisać funkcję, która przyjmuje wskaźnik na funkcję z dowolną liczbą argumentów i jak je do niej przekazać? |
|
Monika90 |
» 2015-02-22 16:39:22 do tego można użyć bilioteki sygnałow i slotów takiej jak boost.signals2, albo std::function z biblioteki standardowej jako namiastki. |
|
pekfos |
» 2015-02-22 16:39:32 Skoro nie znasz argumentów, to jak niby chcesz to wywołać i podać coś sensownego do tej funkcji..?
//edit: Eh, miałem zamiar zwrócić uwagę na poważną lukę w tym planie, a tu doczytałem że, o dziwo, naprawdę o to pytasz ;). Użyj normalnego wskaźnika na funkcję i wymyśl, jakie powinny być argumenty. Tu wystarczy przekazywać do onClicka wskaźnik na naciśnięty przycisk, szczegóły (np etykieta) można sobie odczytać przez interfejs przycisku. |
|
Buby Temat założony przez niniejszego użytkownika |
» 2015-02-22 16:47:06 Na początku, dodam, że korzystam z GTK+. Otóż chodzi mi o to, że w wywołaniu tej funkcji, chcę podpiąć adres funkcji, do zdarzenia "clicked". void Przycisk::Klikniecie( void * Funkcja ) { g_signal_connect( Button, "clicked", G_CALLBACK( Funkcja ), NULL ); } We wszystkich przykładach jakie widziałem, G_CALLBACK dostawał wskaźnik na funkcję. Więc raczej nie wywołuje tej funkcji, tylko przekazuje jej adres dalej. I od razu odpowiadam na pytanie, dlaczego piszę sobie taką klasę - bo chce poćwiczyć tworzenie klas od podstaw. |
|
pekfos |
» 2015-02-22 17:00:58 To nie używa dowolnych funkcji. GTK+ ma zdefiniowane N typów takich funkcji i podawany wskaźnik jest rzutowany na jeden z nich. |
|
Buby Temat założony przez niniejszego użytkownika |
» 2015-02-22 17:43:02 No nic, niestety ja się poddaję - zamiast funkcji OnClick, napisałem funkcję zwracającą wskaźnik, na wymagany argument do przekazania do funkcji i będę to robił ręcznie. Nie mam pomysłu i nie potrafię zrobić tego, co założyłem. |
|
pekfos |
» 2015-02-22 17:50:18 Nie mam pomysłu i nie potrafię zrobić tego, co założyłem. |
Użyj normalnego wskaźnika na funkcję i wymyśl, jakie powinny być argumenty. Tu wystarczy przekazywać do onClicka wskaźnik na naciśnięty przycisk, szczegóły (np etykieta) można sobie odczytać przez interfejs przycisku. |
|
|
« 1 » |