Maison >développement back-end >C++ >Comment puis-je utiliser une fonction membre de classe C comme rappel C ?

Comment puis-je utiliser une fonction membre de classe C comme rappel C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-20 20:36:12781parcourir

How Can I Use a C   Class Member Function as a C Callback?

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

Lors de l'interaction avec des bibliothèques C à partir du code C, il devient nécessaire d'établir des rappels . Cet article explore les défis rencontrés lors de la tentative d'enregistrement d'une fonction membre de classe C en tant que rappel pour une fonction C avec une signature spécifique, int a(int , int ).

Le principal obstacle rencontré est que les fonctions membres non statiques possèdent un premier paramètre implicite de classe de type A*, représentant le pointeur this. Cette inadéquation dans la signature des paramètres entre la fonction de rappel attendue et la fonction membre de la classe C fournie entraîne une erreur de compilation.

Solution :

Pour surmonter ce problème, le membre la fonction doit être déclarée statique. Cela élimine le premier paramètre implicite, permettant à la fonction membre de la classe C d'être enregistrée en tant que rappel.

Approche alternative :

Si le mécanisme d'enregistrement du rappel le permet, une alternative L’approche consiste à créer une fonction wrapper. Cette fonction wrapper peut être une fonction C normale qui transmet les arguments à la fonction membre de la classe C souhaitée. En enregistrant la fonction wrapper comme rappel, la fonction membre de la classe peut être invoquée indirectement via le proxy.

Exemple :

Considérez l'exemple de code ci-dessous :

class A {
public:
   A();
   ~A();
   int e(int *k, int *j);

private:
   static int e_c(int *k, int *j) {
      A* this_ptr = reinterpret_cast<A*>(callback_user_data);
      return this_ptr->e(k, j);
   }
};

A::A()
{
   register_with_library(e_c)
}

Dans le code ci-dessus, la fonction e_c() est une fonction wrapper statique qui convertit l'argument callback_user_data en un Un pointeur*, permettant l'accès au pointeur this et l'invocation ultérieure de la fonction membre e(). Cette approche permet à la fonction membre de la classe C d'être indirectement enregistrée en tant que rappel, même si elle ne correspond pas à la signature exacte de la fonction de rappel.

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