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
Libérer: 2024-12-20 20:36:12
original
786 Les gens l'ont consulté

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)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal