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

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