Maison >développement back-end >C++ >Comment transmettre correctement les fonctions membres de classe en tant que rappels en 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!