Maison >développement back-end >C++ >Les fonctions membres de la classe C peuvent-elles être utilisées comme rappels C ?

Les fonctions membres de la classe C peuvent-elles être utilisées comme rappels C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-15 07:36:14553parcourir

Can C   Class Member Functions Be Used as C Callbacks?

Utilisation d'une fonction membre de classe C comme fonction de rappel C

Problème :

Quand en essayant d'enregistrer une fonction membre de la classe C en tant que fonction de rappel pour une bibliothèque C, le compilateur renvoie une erreur indiquant que le type de la fonction ne correspond pas correspondre à la signature attendue.

Questions :

  1. Est-il possible d'enregistrer une fonction membre de la classe C en tant que fonction de rappel ?
  2. Est-ce que il existe des approches alternatives pour résoudre ce problème problème ?

Réponse :

1. Utilisation d'une fonction membre statique :

Oui, il est possible d'enregistrer une fonction membre de classe C en tant que fonction de rappel, mais il doit s'agir d'une fonction membre statique. Les fonctions membres statiques n'ont pas de premier paramètre implicite de classe de type A*, leur signature correspond donc à la signature de rappel attendue. Par exemple :

class A {
public:
    static int e(int *k, int *j) {
        return 0;
    }
};

int main() {
    register_with_library(A::e);
    return 0;
}

2. Approches alternatives :

Vous pouvez également utiliser l'une des approches suivantes :

  • Créer une fonction gratuite : Créez une fonction gratuite avec le signature et appelez la fonction membre de la classe C à partir de celle-ci. Par exemple :
void e_wrapper(int *k, int *j) {
    A().e(k, j);
}
  • Utiliser un pointeur de fonction : Définissez un pointeur de fonction et attribuez-lui l'adresse de la fonction membre de la classe C. Par exemple :
int (*ptr)(int *, int *) = &A::e;
register_with_library(ptr);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn