Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Funkcja przyjmująca jako argument wskaźnik na dowolną funkcję

Ostatnio zmodyfikowano 2015-02-22 17:50
Autor Wiadomość
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:

C/C++
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.
C/C++
void ZmienEtykietePrzycisku( std::string Etykieta )
{
    //Jakis kod funkcji
}


...
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ć?
P-127116
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.
P-127118
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.
P-127119
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".

C/C++
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.
P-127121
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.
P-127122
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.
P-127129
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.
P-127131
« 1 »
  Strona 1 z 1