10
votes

Comment appeler une fonction pointeur à membre?

Je reçois une erreur de compilation (MS VS 2008) que je ne comprends tout simplement pas. Après avoir joué avec elle pendant de nombreuses heures, tout est floue et je me sens comme il y a quelque chose de très évident (et très stupide) qui me manque. Voici le code essentiel:

typedef int (C::*PFN)(int);

struct MAP_ENTRY
    {
    int id;
    PFN pfn;
    };

class C
    {
    ...
    int Dispatch(int, int);
    MAP_ENTRY *pMap;
    ...
    };

int C::Dispatch(int id, int val)
    {
    for (MAP_ENTRY *p = pMap; p->id != 0; ++p)
        {
        if (p->id == id)
            return p->pfn(val);  // <--- error here
        }
    return 0;
    }


3 commentaires

C Syntaxe est rouillée, donc ne pas ajouter comme réponse, ne devrait-il pas être "retour (* (p-> pfn)) (Val);"? -


Nope, qui donne l'erreur "* Illégale sur les opérandes de type C :: Pfn".


Dupliqué possible de appelant des méthodes de classe C ++ via un pointeur de fonction


4 Réponses :


8
votes

Essayez xxx


1 commentaires

OUI!! C'est ça. Merci beaucoup. Vous êtes incroyable. J'ai vissé avec ceci pendant des heures et j'ai reçu la réponse en moins de 10 minutes.



-1
votes

p-> PFN est un pointeur de fonction. Vous devez utiliser * pour le faire fonctionner. Changer de

(*(p->pfn))(val)


0 commentaires

17
votes

p-> pfn code> est un pointeur de type pointeur à membre. Afin d'appeler une fonction via un tel pointeur, vous devez utiliser l'un ou l'autre opérateur -> * code> ou l'opérateur . * Code> et fournir un objet de type C code > comme l'opérande gauche. Vous n'avez pas fait.

Je ne sais pas quel objet de type C code> est censé être utilisé ici - vous seul savez que - mais dans votre exemple, il est pourrait être em> > * Ceci code>. Dans ce cas, l'appel peut sembler comme suit P>

PFN pfn = p->pfn;
(this->*pfn)(val);


0 commentaires

1
votes

Juste pour sonner avec ma propre expérience, j'ai rencontré une erreur dans g ++ causée par cette affirmation: xxx

où StateHandler est un pointeur à une fonction de membre vide de la classe. référencé par * ceci. Le problème a été causé par les espaces entre l'opérateur de flèche. L'extrait suivant compile bien: xxx

J'utilise g ++ (GCC) 4.4.2 20090825 (PRERRELASe). FWIW.


0 commentaires