Стек указателей на функции: как вызвать функцию? - PullRequest
0 голосов
/ 30 июня 2011

У меня есть стек указателей на функции (все типа void и без параметров). У меня возникают трудности с поиском, как я тогда вызываю / выполняю функцию, которая находится в стеке?

Если вы посмотрите на простой пример, приведенный ниже, все компилируется и работает, за исключением последней строки

typedef class InstructionScreen;
typedef void (InstructionScreen::*MemberFuncPtr)();
stack <MemberFuncPtr> instructionStep;              // This is how I declare it. Works
instructionStep.push( &InstructionScreen::step1 );  // This is how I add the member function step(). Works
(*instructionStep.top())();                         // How do I call the function now? This doesn't work

Это весь код, который я пытаюсь получить для компиляции:

class InstructionScreen
{
     public:
         InstructionScreen()
         {
              instructionStep.push( &InstructionScreen::step1 );
              instructionStep.push( &InstructionScreen::step2 );   

              // add timer to call run instructions each 10 seconds        
         }

         void step1()
         {
         }

         void step2()
         {
         }

         void runInstructions()
         {
              if ( !instructionStep.empty() )
              {
                  *(instructionStep.top())(); 
                  instructionStep.pop();
              }
              // else kill timer
         }

     private:
          stack <MemberFuncPtr> instructionStep;   
};

1 Ответ

2 голосов
/ 30 июня 2011

Вам нужен экземпляр для вызова функции-члена. Попробуйте это:

InstructionScreen screen;
MemberFuncPtr step = instructionStep.top();
(screen.*step)();

Чтобы запустить функцию в стеке из другой функции-члена, вы можете использовать:

MemberFuncPtr step = instructionStep.top();
(this->*step)();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...