11
votes

Utilisation d'un pointeur de fonction membre dans une classe

Compte tenu d'un exemple de classe: xxx

i Obtenez une erreur de compilateur à la ligne appelant la fonction membre via le pointeur "* FUNC (FOO, BAR)", disant: "Terme ne fait pas évaluer à une fonction prenant 2 arguments ". Qu'est-ce que je fais mal?


0 commentaires

5 Réponses :


21
votes

La syntaxe dont vous avez besoin ressemble: xxx

de sorte que votre appel serait: xxx

Je pense qu'une autre syntaxe serait: xxx


0 commentaires

7
votes

Vous avez besoin de la syntaxe génique suivante pour appeler des fonctions de membre via un pointeur:

(this->*func)(foo, bar);


0 commentaires

6
votes

Il y a deux choses que vous devez prendre en charge. Premièrement est la déclaration du type de pointeur de fonction: xxx pré>

Suivant est la syntaxe pour appeler la fonction à l'aide d'un pointeur: p>

#include <iostream>

class Fred
{
public:
  Fred() 
  {
    func = &Fred::fa;
  }

  void run()
  {
    int foo = 10, bar = 20;
    std::cout << (this->*func)(foo,bar) << '\n';
  }

  double fa(int x, int y)
  {
    return (double)(x + y);
  }
  double fb(int x, int y)
  {
  }

private:
  typedef double (Fred::*fptr)(int x, int y);
  fptr func;
};

int
main ()
{
  Fred f;
  f.run();
  return 0;
}


0 commentaires

0
votes

Les fonctions de membre de la classe non statique ont caché ce pointeur comme argument.

Je pense, la syntaxe (Ceci -> * Func) (foo, bar) est le moyen de comprendre le compilateur qu'il doit ajouter ceci à la fonction.


0 commentaires

1
votes

Une fonction de membre avec deux args est vraiment une fonction Trois Arg. "Ceci" est un argument implicite de sorte que l'erreur que vous obtenez est de manquer le "Ceci" Arg.


0 commentaires