2011-06-30 12 views
0

私は関数ポインタのスタックを持っています(voidの型はすべてパラメータなしの&です)。私はスタックにある関数をどのように呼び出して実行するかを見つけるのが難しいですか?関数ポインタのスタック:関数の呼び出し方法?

everthingが、最後の行以外&作品

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

これは、スタックとは何の関係もありません、それはメンバーを呼び出す方法」であります関数ポインタ "と呼びます。検索ボックスに入力します。 –

+0

あなたは「メンバー関数へのポインタのスタック」を持っている「関数ポインタのスタック」を持っておらず、それらはすべて「void型およびパラメータなし」ではありません。その後、追加のパラメータを取らずに 'void 'を返します。 – Lambdageek

+0

メンバ関数が特定の*オブジェクトインスタンス*にではなく*クラス*に縛られていることを理解することが重要です。したがって、メンバ関数ポインタは、そのクラスの具体的なオブジェクトインスタンスを指定せずには使用できない抽象的なものに過ぎません。要するに、*あなたはオブジェクトのメンバーを呼び出したいコンパイラに伝える必要があります。 –

答えて

2

メンバー関数を呼び出すにはインスタンスが必要です。あなたが使用することができ、他のメンバ関数内からスタック内の関数を実行するには

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

:これを試してみてください

MemberFuncPtr step = instructionStep.top(); 
(this->*step)(); 
+0

memeber関数InstructionScreen :: runInstructions()内から関数を呼び出すにはどうすればよいですか? – user593747

+0

私の答えを更新しました。 –