40
class Foo {
public:
    Foo() { do_something = &Foo::func_x; }

    int (Foo::*do_something)(int);   // function pointer to class member function

    void setFunc(bool e) { do_something = e ? &Foo::func_x : &Foo::func_y; }

private:
    int func_x(int m) { return m *= 5; }
    int func_y(int n) { return n *= 6; }
};

int
main()
{
    Foo f;
    f.setFunc(false);
    return (f.*do_something)(5);  // <- Not ok. Compile error.
}

どうすればこれを機能させることができますか?

4

6 に答える 6

36
 class A{
    public:
        typedef int (A::*method)();

        method p;
        A(){
            p = &A::foo;
            (this->*p)(); // <- trick 1, inner call
        }

        int foo(){
            printf("foo\n");
            return 0;
        }
    };

    void main()
    {
        A a;
        (a.*a.p)(); // <- trick 2, outer call
    }
于 2009-06-13T13:07:14.313 に答える
34

ご希望のラインは

   return (f.*f.do_something)(5);

(それはコンパイルされます-私はそれを試しました)

" *f.do_something" はポインター自体を指します --- "f" は、do_something 値をどこから取得するかを示します。ただし、関数を呼び出すときに this ポインターになるオブジェクトを指定する必要があります。そのため、f.接頭辞 " " が必要です。

于 2009-06-13T13:18:41.227 に答える
3
class A {
    int var;
    int var2;
public:
    void setVar(int v);
    int getVar();
    void setVar2(int v);
    int getVar2();
    typedef int (A::*_fVar)();
    _fVar fvar;
    void setFvar(_fVar afvar) { fvar = afvar; }
    void insideCall() { (this->*fvar)(); }
};

void A::setVar(int v)
{
    var = v;
}

int A::getVar()
{
    std::cout << "A::getVar() is called. var = " << var << std::endl;
    return var;
}

void A::setVar2(int v2)
{
    var2 = v2;
}

int A::getVar2()
{
    std::cout << "A::getVar2() is called. var2 = " << var2 << std::endl;
    return var2;
}

int main()
{
    A a;
    a.setVar(3);
    a.setVar2(5);

//    a.fvar = &A::getVar;
    a.setFvar(&A::getVar);
    (a.*a.fvar)();

    a.setFvar(&A::getVar2);
    (a.*a.fvar)();

    a.setFvar(&A::getVar);
    a.insideCall();

    a.setFvar(&A::getVar2);
    a.insideCall();

    return 0;
}

NickDandoulakisの答えを拡張しました。ありがとうございました。

クラス外からメンバー関数ポインタを設定する関数を追加しました。メンバー関数ポインターの内部呼び出しを表示するために、外部から呼び出すことができる別の関数を追加しました。

于 2012-11-06T12:33:49.600 に答える
0
#include<iostream>
using namespace std;

class A {

public:
    void hello()
    {
        cout << "hello" << endl;
    };

    int x = 0;

};


void main(void)
{

    //pointer
    A * a = new A;
    void(A::*pfun)() = &A::hello;
    int  A::*v1 = &A::x;

    (a->*pfun)();
    a->*v1 = 100;
    cout << a->*v1 << endl << endl;

    //----------------------------- 
    A  b;
    void(A::*fun)() = &A::hello;
    int  A::*v2 = &A::x;

    (b.*fun)();
    b.*v2 = 200;
    cout << b.*v2 << endl;

}
于 2016-05-11T15:34:32.613 に答える
0

(f.*do_something)(5); を試してください。

于 2009-06-13T13:05:12.897 に答える
-4

クラスの非静的メンバーの呼び出しは、静的メンバー関数を使用して行うこともできると思います。

于 2009-10-22T10:20:45.387 に答える