2 votes

Comment passer une fonction d'une structure à une autre fonction dans une structure différente en utilisant un paramètre

Je suis en train d'apprendre le concept de passer une fonction en tant que paramètre.

Tout d'abord, j'ai essayé de passer une "fonction libre" (une fonction qui n'appartient à aucune classe ou structure) à une autre fonction libre en utilisant ce pointeur void(*Func)(int) et cela a fonctionné.

Deuxièmement, passer une fonction libre à une fonction appartenant à une structure en utilisant le même pointeur a également fonctionné.

Mais lorsque j'ai essayé de passer une fonction dans une structure à une autre fonction dans une structure différente avec ce même pointeur, une erreur s'est affichée.

Voici mon code:

#include 
#include 
#include 
#include 

using namespace std;

struct A {
    void Func_A (void (*Func)(int)) {
        (*Func)(5);
    }
};

struct B {
    void Func_B (int a) {
        cout<

`Voici l'erreur affichée:

[Error] no matching function for call to 'A::Func_A()'`

1voto

Elias Points 870

Considérez cet exemple:

#include 
using namespace std;

struct A {
    void Func_A (void (*Func)(int)) {
        (*Func)(5);
    }
};

struct B {
  int x;
  void Func_B (int a) {
    cout << a << " " << x;
  }
};

int main () {
    A a;
    B b1;
    b1.x = 1;
    B b2;
    b2.x = 2;
    a.Func_A(b1.Func_B);
    return 0;
}

Dans cet exemple, Func_B utilise à la fois l'entrée a et l'élément de données x, de sorte qu'il est clair que le résultat de l'appel à Func_B sera différent en fonction de l'objet, s'il s'agit de b1 ou b2 qui l'appelle.

Vous pourriez penser que prendre le pointeur de fonction "b1.Func_B" clarifierait que vous souhaitez dire la fonction associée à l'objet b1, mais cela ne fonctionne pas car les fonctions membres n'existent pas séparément pour chaque instance. La fonction Func_B n'existe qu'une seule fois en mémoire, il n'est donc pas possible d'avoir des pointeurs de fonction distincts pour "b1.Func_B" et "b2.Func_B". Donc, cela ne peut pas fonctionner.

Le compilateur g++ 8.2.0 donne le message d'erreur suivant pour la ligne a.Func_A(b1.Func_B); dans le code:

error: invalid use of non-static member function ‘void B::Func_B(int)’

suggérant qu'il serait possible de faire une telle chose pour une fonction membre statique. Cela a du sens, car une fonction membre statique ne peut pas utiliser les éléments de données d'une instance, elle est donc plus comme une "fonction libre", indépendante d'une instance.

1voto

Paul Sanders Points 7378

Pour passer une fonction membre non statique, la syntaxe est un peu différente. Voici votre code original retravaillé pour montrer cela:

#include 

struct B {
    void Func_B (int a) {
        std::cout << a;
    }
};

struct A {
    void Func_A (void (B::*Func)(int), B &b) {
        (b.*Func) (5);
    }
};

int main () {
    A a;
    B b;
    a.Func_A (&B::Func_B, b);
    return 0;
}

Notez la signature de fonction différente pour Func_A et le fait que vous devez passer une instance de la classe B lorsque vous l'appelez.

Démo en direct

C'est dommage que vous ne puissiez pas utiliser C++11. std::function rend cela beaucoup plus simple et généralisé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X