Bonjour à toutes et à tous,

Je suis désolé, mais la présentation de mon problème est un peu longue. Merci d'avance à ceux qui auront le courage d'aller jusqu'au bout.

J'ai une classe de composant visuel :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Class Comp {
  ...
  void(*surAppui)(boolean);
  virtual boolean select(int x, int y);
}
Dans son constructeur, "surAppui = NULL". La fonction "select" est la suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Comp::select(int x, int y) {
  if (x et y dans la zone d'appui sur le composant)
    if (surAppui != NULL)
      surAppui(un boolean); // je renvois sur une fonction qui va faire ce que je veux
}
Cette fonction "surAppui" a le même mécanisme que le "onClick" dans Windows par exemple.

J'ai créé des enfants de "Comp", par exemple "Bouton".

Maintenant, à l'utilisation, j'instancie une classe "Bouton monBouton" et j'affecte à "surAppui" une fonction "quoiFaire" :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
monBouton.surAppui = &quoiFaire;
 
void quoiFaire(boolean a) {
  //Exécute ce que j'ai envie de faire
}
Tout ce mécanisme fonctionne très bien, mais maintenant, je voudrais que ce mécanisme fonctionne à l'intérieur de mes classes.

J'ai créé une classe "Page" descendant de "Comp" et utilisant "Bouton" :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
class Page : public Comp {
  Bouton btn1;
  void chgtPage(boolean); // la fonction que veux associer à "surAppui"
  virtual boolean select(int x, int y); // modifie le comportement de la classe de base
  Page(les params qui vont bien) : btn1(ses params) {
    btn1.surAppui = &chgtPage // l'affectation de "chgtPage" à "surAppui"
  }
}
Alors que la construction de ce lien est semblable à celui qui fonctionne, c'est sur cette dernière instruction que le compilateur n'est pas d'accord. Il me renvoit l'erreur suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
MaClasse.cpp:13:24: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.  Say '&Page::chgtPage' [-fpermissive]
  btn1.surAppui = &chgtPage;
                        ^
MaClasse.cpp:13:21: error: cannot convert 'void (Page::*)(boolean) {aka void (Page::*)(bool)}' to 'void (*)(boolean) {aka void (*)(bool)}' in assignment
  btn1.surAppui = &chgtPage;
                     ^
Voilà, j'ai toujours été mal à l'aise avec ce genre de message. Si vous pouviez m'aider à trouver ce qui cloche.

Merci de votre aide.

Pierre