Advertisement
Guest User

Untitled

a guest
May 23rd, 2015
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 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.     virtual void MethA(void){
  30.         //execute some code if ok set the next method
  31.         pfMethod->setCallBack( (void (classA::*)(void))&classA::MethB);
  32.         //
  33.     }
  34.     virtual void MethB(void){
  35.         //execute some code
  36.         pfMethod->setCallBack( (void (classA::*)(void))&classA::MethC);
  37.  
  38.     }
  39.     virtual void MethC(void){
  40.         //execute some code and return in Idle state
  41.         pfMethod->setCallBack( (void (classA::*)(void))&classA::Idle);
  42.     }
  43.     virtual void OnTick(){
  44.         (*pfMethod)();
  45.     }
  46.     virtual void Run(){
  47.         //init the state machine to the first method to execute.....
  48.         pfMethod->setCallBack( (void (classA::*)(void))&classA::MethA);
  49.     }
  50.  
  51. }
  52.  
  53.  
  54.  
  55. classB: public classA
  56. {
  57. public:
  58.     classB():classA();
  59.     void MethA(void){
  60.         //execute the same method of classA
  61.         classA::MethA();
  62.     }
  63.     void MethB(void){
  64.         //execute the same method of classB but changes the next step
  65.         //of state machine 
  66.         classA::MethB();
  67.         pfMethod->setCallBack( (void (classA::*)(void))&classB::MethInserted);
  68.     }
  69.     void MethInserted(void){
  70.         //do something different
  71.         //but set the next step to the one of base state machine
  72.         pfMethod->setCallBack( (void (classA::*)(void))&classB::MethC);
  73.     }
  74.  
  75.     void MethC(void){
  76.         //return to do the original state machine...
  77.         classA::MethC();
  78.     }  
  79.     void OnTick(){
  80.         (*pfMethod)();
  81.     }
  82.     void Run(){
  83.         //init the first method to execute
  84.         pfMethod->setCallBack( (void (classA::*)(void))&classB::MethA);
  85.     }
  86.  
  87. };
  88.  
  89. int main()
  90. {
  91.     classA* pA = new classA();
  92.     classB* pB = new classB();
  93.     pb->Run();
  94.     while(1)
  95.     {
  96.     pB->OnTick();
  97.     }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement