Maison > développement back-end > C++ > Comment puis-je transmettre correctement les pointeurs de fonctions membres en C ?

Comment puis-je transmettre correctement les pointeurs de fonctions membres en C ?

Mary-Kate Olsen
Libérer: 2024-12-05 08:52:10
original
299 Les gens l'ont consulté

How Can I Correctly Pass Member Function Pointers in C  ?

Passer des pointeurs de fonctions membres en C

En programmation orientée objet, il est souvent nécessaire de passer une fonction membre en argument à une autre fonction. Cependant, faire cela correctement peut être un peu délicat, surtout lors de l'utilisation du pointeur this.

Considérons un exemple spécifique de l'extrait de code fourni :

class testMenu : public MenuScreen {
  // ...
  void test2() {
    draw = true;
  }
};

MenuButton<testMenu> x;

testMenu() : MenuScreen("testMenu") {
  x.SetButton(100, 100, ..., &test2);
}
Copier après la connexion

Ici, la fonction membre test2 est affecté au membre ButtonFunc du MenuButton à l'aide de la fonction SetButton :

template <class object>
void MenuButton::SetButton(..., void (object::*ButtonFunc)()) {
  this->ButtonFunc = &ButtonFunc;
}
Copier après la connexion

Le problème survient lors de l'appel du fonction test2 de la classe MenuButton. Pour ce faire, nous avons besoin à la fois d'un pointeur vers l'objet (c'est-à-dire testMenu) et d'un pointeur vers la fonction (c'est-à-dire &test2). Dans la version modifiée de SetButton :

template <class object>
void MenuButton::SetButton(..., object *ButtonObj, void (object::*ButtonFunc)()) {
  this->ButtonObj = ButtonObj;
  this->ButtonFunc = ButtonFunc;
}
Copier après la connexion

Nous passons une référence à l'objet, accessible à l'aide du pointeur ButtonObj. Le pointeur de fonction membre est ensuite invoqué en utilisant ((ButtonObj)->*(ButtonFunc))().

Enfin, le constructeur testMenu corrigé :

testMenu() : MenuScreen("testMenu") {
  x.SetButton(100, 100, ..., this, &test2);
}
Copier après la connexion

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 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