Pointeur de fonction c++ (membre de la classe) vers une fonction membre non statique

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.
}

Comment puis-je faire en sorte que cela fonctionne?

39
demandé sur Girish 2009-06-13 16:56:16

6 réponses

La ligne que vous voulez est

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

(Qui compile -- je l'ai essayé)

"*f.do_something" fait référence au pointeur lui-même - - - " f " nous dit Où obtenir la valeur do_something de . Mais nous devons toujours donner un objet qui sera le pointeur this lorsque nous appelons la fonction. C'est pourquoi nous avons besoin du préfixe " f.".

32
répondu James Curran 2009-06-13 13:18:41
 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
    }
35
répondu Nick Dandoulakis 2013-01-12 12:13:02
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;
}

J'ai prolongé la réponse de Nick Dandoulakis. Merci.

J'ai ajouté une fonction qui définit le pointeur de fonction membre de l'extérieur de la classe. J'ai ajouté une autre fonction qui peut être appelée de l'extérieur pour montrer intérieure appel de fonction membre pointeur.

3
répondu Volkan Ozyilmaz 2012-11-06 14:30:50

Try (F. * do_something) (5);

0
répondu Suvesh Pratapa 2009-06-13 13:05:12
#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;

}
0
répondu SaeidMo7 2016-05-11 15:34:32

Je pense que l'appel d'un membre non statique de la classe pourrait également être fait en utilisant une fonction de membre statique.

-4
répondu Pradip Bhojania 2009-10-22 10:20:45