2013-05-27 20 views
16

私は実行時に変更したいメンバ関数へのポインタを使用するこのコード例を持っていますが、動作させることはできません。私はすでにthis->*_currentPtr(4,5)(*this)._currentPtr(4, 5)を試しました。同じクラスの中のメソッドへのポインタを呼び出す正しい方法は何ですか?C++:ポインタを介してメンバ関数を呼び出す

エラー:式は(ポインタツー)関数型に

#include <iostream> 
#include <cstdlib> 

class A { 

public: 

    void setPtr(int v); 
    void useFoo(); 

private: 
    typedef int (A::*fooPtr)(int a, int b); 

    fooPtr _currentPtr; 

    int foo1(int a, int b); 
    int foo2(int a, int b); 
}; 

void A::setPtr(int v){ 
    if(v == 1){ 
     _currentPtr = foo1; 
    } else { 
     _currentPtr = foo2; 
    } 
} 

void A::useFoo(){ 

    //std::cout << this->*_currentPtr(4,5); // ERROR 
} 

int A::foo1(int a, int b){ 
    return a - b; 
} 

int A::foo2(int a, int b){ 
    return a + b; 
} 

int main(){ 

    A obj; 

    obj.setPtr(1); 
    obj.useFoo(); 

    return 0; 
} 
+0

取得している問題とエラーメッセージは何ですか? –

答えて

23

を持っている必要がありますあなたはfoo sが(から来ているクラスをコンパイラに指示する必要があり、それ以外の場合は、彼らがしていると考えてグローバルスコープからの機能):

void A::setPtr(int v){ 
    if(v == 1){ 
     _currentPtr = &A::foo1; 
        // ^^^^ 
    } else { 
     _currentPtr = &A::foo2; 
        // ^^^^ 
    } 
} 

、あなたはここで、括弧のセットが必要です。

+1

ありがとうございました。しかし、なぜ私は '& '演算子が必要なのか混乱しています。私は関数がアドレスとして扱われると思いました。 – ashur

+2

@ashurこれは、通常の関数には当てはまりますが、メンバ関数には当てはまりません。後者は通常のポインタではありません。 – jrok

+2

@ashurメンバーポインタのイン・アウトに関する興味深い記事については、[この記事(http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible)を参照してください。 – jrok

関連する問題