2011-01-12 4 views
0

J'essaye d'obtenir l'adresse d'une fonction de membre, mais je ne sais pas comment. J'apprécierais que quelqu'un puisse me dire ce que je fais de mal. Comme vous pouvez le voir dans mon exemple ci-dessous, ni (long) & g ni (long) & this-> g travail et je ne peux pas comprendre la syntaxe correcte:cette adresse de pointeur et membre de fonction

/* Create a class that (redundantly) performs data member selection 
and a member function call using the this keyword (which refers to the 
address of the current object). */ 

#include<iostream> 
using namespace std; 

#define PR(STR) cout << #STR ": " << STR << endl; 

class test 
{ 
public: 
    int a, b; 
    int c[10]; 
    void g(); 
}; 

void f() 
{ 
    cout << "calling f()" << endl; 
} 

void test::g() 
{ 
    this->a = 5; 
    PR((long)&a); 
    PR((long)&b); 
    PR((long)&this->b);  // this-> is redundant 
    PR((long)&this->c);  // = c[0] 
    PR((long)&this->c[1]); 
    PR((long)&f); 
// PR((long)&g);  // this doesn't work 
// PR((long)&this->g);  // neither does this 

    cout << endl; 
} 

int main() 
{ 
    test t; 
    t.g(); 
} 

Merci à l'avance!


Merci pour votre réponse! Cependant, je n'arrive toujours pas à le faire fonctionner. Si je change la ligne

PR((long)&g); 

à

PR((long)&test::g); 

, il ne fonctionne toujours pas.

PR(&test::g); 

œuvres en main(), mais pas

PR((long)&test::g); 

???

Je pense qu'il me manque quelque chose. :(

+0

L'adresse n'est pas nécessairement un numéro (il se peut que ce ne soit pas suffisant). Cast to (void *) le code du flux ne fera qu'imprimer l'adresse. –

Répondre

1

Vous devez préfixer la fonction membre avec le nom de la classe.

&test::g; 

Une fonction membre (ou méthode) est lié à une classe, et non une instanciation

1

En outre, vous pouvez utiliser le format suivant pour afficher des pointeurs directement:

printf ("% p", & essai :: g);

qui imprime "008C1186" sur ma machine.

Questions connexes