Maison >développement back-end >C++ >Une fonction membre de la classe C peut-elle être utilisée comme fonction de rappel C ?

Une fonction membre de la classe C peut-elle être utilisée comme fonction de rappel C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-11 17:42:13409parcourir

Can a C   Class Member Function Be Used as a C Callback Function?

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

Il est possible d'enregistrer une fonction membre de classe C en tant que fonction de rappel C , mais il y a certaines exigences à satisfaire.

Q1 : Tout d'abord, est-il possible d'enregistrer une fonction membre de la classe C comme j'essaie faire et si oui comment ?

A1 : Oui, il est possible d'enregistrer une fonction membre de la classe C en tant que fonction de rappel si la fonction est déclarée comme fonction statique. Les fonctions membres statiques n'ont pas de pointeur « this » implicite comme premier argument, contrairement aux fonctions membres non statiques. Cela leur permet d'être compatibles avec la signature d'une fonction de rappel C.

Q2 : Existe-t-il une autre/meilleure façon de résoudre ce problème ?

A2 : Voici quelques options alternatives :

  • Créer une fonction gratuite : Implémenter une fonction gratuite (non-membre) distincte qui correspond à la signature de la fonction de rappel, puis enregistrez-la auprès de la bibliothèque.
  • Utilisez un pointeur de fonction : Créez un pointeur de fonction vers une fonction membre statique de la classe C et transmettez le pointeur de fonction au bibliothèque. Cela nécessite que la bibliothèque prenne en charge l'utilisation de pointeurs de fonction comme fonctions de rappel.
  • Utilisez une fonction wrapper : Définissez une fonction wrapper en dehors de la classe qui appelle la fonction membre de la classe souhaitée et possède une signature compatible avec la fonction de rappel C. Ensuite, enregistrez la fonction wrapper auprès de la bibliothèque.

Exemple d'utilisation d'une fonction membre statique :

class A {
public:
    A() { register_with_library(&A::e); }
    ~A() {}

    static int e(int *k, int *j) {
        return 0;
    }
};

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