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
Mary-Kate Olsenoriginal
2024-12-05 08:52:10287parcourir

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);
}

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

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

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);
}

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