• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźnik funkcyjny jako parametr w innej funkcji.

Object Storage Arubacloud
+1 głos
561 wizyt
pytanie zadane 2 września 2016 w C i C++ przez Mrcixx Początkujący (290 p.)

Witam.

Piszę prosty silnik pod gry karciane w C++ Builderze 6 i mam kolejny problemik.

A mianowicie mam klasę Cards, w której jest funkcja:

public:
createCard(int Left,intTop,??)
{
TImage *Karta;
Karta = new TImage(Form1);
Karta->Parent = Form1;
Karta->OnDblClick = ??;
}

I tam, gdzie jest ?? mam problem... Jak to zrobić, aby przekazać funkcję (lub wskaźnik do niej).

Wiem, że trzeba stworzyć: 

typedef void (*WSK) (_fastcall *(_closure)(TObject *))(TObject *);
lub po prostu 
void (*WSK) (_fastcall *(_closure)(TObject*))(TObject *);

i potem to przekazać:

Cards x;
x.createCards(12,12,WSK);

ale co wpisac w ?? w deklaracji funkcji?

Wiem, że problem jest zawiły, ja mam problemy ze wskaźnikami i że nie umiem perfekcyjnie opisywać problemu.

Dziękuję za pomoc.

PS. Próbowałem już zrobić:

createCard(int Left,int Top, void (*func)(_fastcall *(_closure)(TObject *))(TObject *))
{
//Tu tworzenie TImage
Karta->OnDblClick = &func; //zwykłe func też nic nie daje
}

ale nie pomaga.

createCard(int Left,int Top, void (*func)())
{
//Tu tworzenie TImage
Karta->OnDblClick = &func; //zwykłe func też nic nie daje
}

też nie działa.

komentarz 2 września 2016 przez Patrycjerz Mędrzec (192,320 p.)
Pokaż deklarację funkcji, której adres chcesz przekazać.
komentarz 2 września 2016 przez Mrcixx Początkujący (290 p.)

przekazać chcę funkcję:

(w pliku unit.cpp wygląda ona tak \/)
void __fastcall TForm1::Klikniecie(TObject *S)
{
//funckja OnDblClick
}
(a w pliku unit.h \/)
void __fastcall Klikniecie(TObject *S);

 

komentarz 3 września 2016 przez Patrycjerz Mędrzec (192,320 p.)
Jeśli funkcja znajduje się w obiekcie, to jaki problem przesłać tylko obiekt?
komentarz 3 września 2016 przez Mrcixx Początkujący (290 p.)
Funkcja nie znajduje sie w obiekcie, tylko ja chce tą funkcje przypisać do nowo tworzonego obiektu, którego tworzę w "createCard(int,int,void)".

Ale żeby ją przypisać muszę ją przesłać do funkcji createCard(int,int,void) (bo funkcja znajduje sie w odrębnym pliku, a include'owanie unit.h nie bedzie mialo sensu, jak mam #include "CF.h" w unit.h).
komentarz 3 września 2016 przez Patrycjerz Mędrzec (192,320 p.)

Mam rozumieć, że zmienna OnDblClick to wskaźnik na funkcję?

Ogólnie ten pomysł jest irracjonalny. Korzystasz z klas, obiektów i używasz wskaźników na funkcje.

Z moich testów wynika, że niemożliwe jest pobranie adresu metody.

Jeśli mocno potrzebujesz tego wskaźnika, stwórz zwykłą funkcję - one nie mają takich zastrzeżeń.

1 odpowiedź

0 głosów
odpowiedź 2 września 2016 przez Patrycjerz Mędrzec (192,320 p.)

W parametrach funkcji wpisujesz deklarację wskaźnika - to wszystko.

Twoje zapisy w stylu:

void (*WSK)(_fastcall *(_closure)(TObject*))(TObject *);

są niepoprawne, gdyż schemat tworzenia wskaźnika to:

typ_nazwa (*nazwa)(typ_param1 param1, ...);

czyli jeden nawias za dużo.

Wydaję mi się także, że słowo __fastcall  (nie _fastcall) nie powinno być w takiej deklaracji. Konwencja wywołania nie jest elementem języka i nie jest potrzebna do stworzenia wskaźnika.

komentarz 2 września 2016 przez Mrcixx Początkujący (290 p.)

Jeżeli zmienna OnDblClick w TImage przyjmuje tylko:

void (__fastcall *(_closure)(TObject *))(TObject *)

i właśnie taką funkcję muszę przekazać to jak muszę zapisać parametry funkcji?? 

void (*func) (__fastcall *(_closure),(TObject *),(TObject *))

? Czy jakoś innaczej?

I sorka za tylko jedną podłogę w __fastcall'u. Wtedy pisalem na telefonie (kabel do internetu padł, a wifi na moim lapku nie ma :( ) i jako iż w builderze __fastcall sie pogrubia i __ wyglada jak _ to mogłem się pomylić. :)

komentarz 3 września 2016 przez Patrycjerz Mędrzec (192,320 p.)
Ten zapis jest jakiś mocno udziwniony... musiałbym zobaczyć fragment kodu, aby zrozumieć, o co ci chodzi.
komentarz 3 września 2016 przez Mrcixx Początkujący (290 p.)

mogę wrzucić link do pobrania plików c++Buildera6 :)

http://skilletss.cba.pl/links

Podobne pytania

0 głosów
1 odpowiedź 834 wizyt
pytanie zadane 8 kwietnia 2016 w C i C++ przez emilime Nowicjusz (220 p.)
0 głosów
1 odpowiedź 537 wizyt
+1 głos
1 odpowiedź 770 wizyt
pytanie zadane 12 sierpnia 2015 w Rozwój zawodowy, nauka, praca przez Patrycjerz Mędrzec (192,320 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...