Maison >développement back-end >C++ >Comment transmettre correctement les fonctions membres de classe en tant que rappels en C ?

Comment transmettre correctement les fonctions membres de classe en tant que rappels en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-16 13:26:21537parcourir

How to Correctly Pass Class Member Functions as Callbacks in C  ?

Surmonter les erreurs de compilation lors du passage de fonctions membres de classe en tant que rappels

Vous rencontrez des erreurs de compilation lors du passage d'une fonction membre de classe en tant que rappel en raison de malentendus à propos de la syntaxe et du paramètre "this" caché dans les fonctions membres.

Clarification du membre Fonctions

Les fonctions membres ne sont pas des fonctions autonomes mais plutôt des fonctions avec un pointeur "this" caché supplémentaire. Ce pointeur fait référence à l'instance de la classe à laquelle appartient la fonction. Lors de l'appel d'une fonction membre à l'aide de la syntaxe d'instance de classe (par exemple, object.memberFunction()), le compilateur détermine automatiquement la valeur de "this".

Énigme de syntaxe

Votre approche initiale a échoué car vous avez tenté de transmettre &CLoggersInfra::RedundancyManagerCallBack comme rappel. Ce pointeur de fonction ne dispose pas du pointeur "this" nécessaire. La syntaxe correcte est :

m_cRedundencyManager->Init(std::bind(&CLoggersInfra::RedundencyManagerCallBack, this));

Dévoilement du "this" caché

Vous souhaitez transmettre un rappel spécifique à une instance particulière de la classe CLoggersInfra. Pour prendre en compte le pointeur "this" caché, vous devez le lier explicitement.

std::bind1st et boost::bind Rescue

Utilisez std::bind1st ou boost::bind pour lier le pointeur "this", créant une nouvelle fonction qui prend l'instance comme paramètre caché et les paramètres d'origine du rappel comme d'habitude. Cela résout le problème de compilation.

The Hidden Catch

Init nécessite un pointeur de fonction brut, que boost::bind ne fournit pas par défaut. Cependant, StackOverflow propose une solution pour convertir les fonctions boost:: en pointeurs bruts.

Mise à jour C 11 avec les fonctions Lambda

Dans C 11 et versions ultérieures, les fonctions lambda qui capturent "this" peut remplacer boost::bind à cet effet.

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