[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