[Numbat] FSM
Tomasz Mrugalski
thomson at klub.com.pl
Tue Mar 20 16:39:40 CET 2007
On Tue, 20 Mar 2007 somebody known as Andrzej Bojarski wrote:
> Tomek - mógłbyś mi tak w trzech zdaniach wyjaśnić dlaczego funkcje
>maszyny stanów są static ? Po prostu chciałbym w jednej z nich wywoływać
>zwykłą funkcję void i zakładając, że nie jestem w stanie podać z góry
>nazwy obiektu nie jest to możliwe.
Chodzi o to, że wskaźniki do tych funkcji podaje się przy rejestrowaniu
stanów. Mechanizm rejestracji jest generyczny, czyli używany w klasie FSM.
Pewnie wiesz (a może nie wiesz?), ale do każdej metody niestatycznej
(czyli takiej normalnej) jest przekazywany w sposób niejawny (tzn. nie ma
go na liście parametrów) dodatkowy parametr this. I tu pojawia się
problem. Bo this to wskaźnik na objekt klasy (np. WMaxCtrlSS). W klasie
bazowej nie ma jak zdefiniować takiego typu. Dlatego wykombinowałem (a w
sumie to zgapiłem) pomysł z metodami static. Wiem, że z tego sie biednie
korzysta. Ale nie znam lepszego rozwiązania.
No, może gdyby pokombinować z definicją typu onEventFunc, to by się coś
udało zrobić. W sumie przy definiowaniu stanów trzebaby nazwy funckji
rzutować. Jeżeli Ci to przeszkadza i masz pomysł, jak to zrobić bez
staticów, to ja jak najbardziej popieram.
Jeżeli chodzi o wywołanie funkcji - jest możliwość. Jednym z parametrów
jest pointer na FSM *. Ten pointer możesz sobie zrzutować na pointer na
konkretną klasę, np. WMaxCtrlSS. I wywołać metode na tym obiekcie.
Poszukaj w wmaxctrl.cc frazy dynamic_cast i obadaj kod.
Mam nadzieje, że pomogłem.
Pzdr,
--
Tomasz Mrugalski, | " Talk is cheap. Show me the code." |
thomson(at)klub(dot)com(dot)pl | Linus Torvalds |
p.s.
Widziałem, że coś checkinowaliście. Yeah! Jak znajde chwile, to obejrze.
More information about the Numbat
mailing list