Advertisement
Guest User

Untitled

a guest
May 23rd, 2015
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.21 KB | None | 0 0
  1. template <class TClass> class TCallbackFunctorClassMemberFunction
  2. {
  3. private:
  4. void (TClass::*fpt)(void); // pointer to member function
  5. TClass* pt2Object; // pointer to object
  6. public:
  7. TCallbackFunctorClassMemberFunction(TClass* _pt2Object, void (TClass::*_fpt)(void))
  8. {
  9. pt2Object = _pt2Object;
  10. fpt=_fpt;
  11. };
  12. // override operator "()"
  13. virtual void operator()(void)
  14. { return (*pt2Object.*fpt)();}  // execute member function
  15. virtual void setCallBack(void(TClass::*_fpt)(void)) //change the callback pointer
  16. { fpt=_fpt;}
  17. };
  18. classA
  19. {
  20. protected:
  21. TCallbackFunctorClassMemberFunction<classA>* pfMethod;
  22. public:
  23. virtual classA(void){
  24. // init the pointer to method to execute in state machine
  25. pfMethod = new TCallbackFunctorClassMemberFunction<classA>(this,(void (classA::*)(void))&classA::Idle)
  26. }
  27. virtual void Idle(void){
  28.  
  29. }
  30.  
  31. virtual void MethA(void){
  32.  
  33. //execute some code if ok set the next method
  34. pfMethod->setCallBack( (void (classA::*)(void))&classA::MethB);
  35. //
  36. }
  37.  
  38. virtual void MethB(void){
  39.  
  40. //execute some code
  41. pfMethod->setCallBack( (void (classA::*)(void))&classA::MethC);
  42.  
  43. }
  44.  
  45. virtual void MethC(void){
  46.  
  47. //execute some code and return in Idle state
  48. pfMethod->setCallBack( (void (classA::*)(void))&classA::Idle);
  49. }
  50. virtual void OnTick(){
  51.  
  52. (*pfMethod)();
  53. }
  54.  
  55.  
  56. virtual void Run(){
  57.  
  58. //init the state machine to the first method to execute.....
  59. pfMethod->setCallBack( (void (classA::*)(void))&classA::MethA);
  60.  
  61. }
  62.  
  63. }
  64.  
  65.  
  66.  
  67. classB: public classA
  68. {
  69.  
  70. public:
  71.  
  72. classB():classA();
  73.  
  74. void MethA(void){
  75.  
  76. //execute the same method of classA
  77. classA::MethA();
  78. }
  79.  
  80. void MethB(void){
  81.  
  82. classA::MethB();
  83.  
  84. pfMethod->setCallBack( (void (classA::*)(void))&classB::MethInserted);
  85.  
  86. }
  87. void MethInserted(void){
  88.  
  89. //do something different
  90. pfMethod->setCallBack( (void (classA::*)(void))&classB::MethC);
  91. }
  92.  
  93. void MethC(void){
  94.  
  95. //return to do the original state machine...
  96. classA::MethC();
  97.  
  98. }
  99.  
  100.  
  101.  
  102. void OnTick(){
  103.  
  104. (*pfMethod)();
  105.  
  106. }
  107.  
  108. void Run(){
  109. //init the first method to execute
  110. pfMethod->setCallBack( (void (classA::*)(void))&classB::MethA);
  111. }
  112.  
  113. }
  114.  
  115. int main()
  116. {
  117.  
  118. classA* pA = new classA();
  119.  
  120. classB* pB = new classB();
  121.  
  122. pb->Run();
  123.  
  124. while(1)
  125. {
  126.  
  127.  
  128. pB->OnTick();
  129.  
  130. }
  131.  
  132.  
  133.  
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement