[C++] Problème avec les pointeurs de fonctions

Problème avec les pointeurs de fonctions [C++] - C++ - Programmation

Marsh Posté le 09-09-2005 à 13:56:49    

Bonojur, je suis en train d'essayer de developper une interface graphique, et je me suis retrouvé bloqué qur un pont auquel je ne m'attendais pas du tout...
 
J'ai quelques soucis avec des passages de fonction...
 
 
voici en simplifié ce que donne mes classes
 

Citation :


class touche
{
 
 void OnEvent()
 void* UserFonction()
 
 
}
 
touche::  OnEvent
{
  //...
     UserFonction();
     //...
}
 
 
class Container
{
   //...
 touche touche1;
 void OnTouch()   ;
 void actiontouche1();
 //...
}
 
 
 
Container::Container
{
 
touche1.UserFonction=actiontouche1;
 
}
 
Container::OnTouch()
{
//...
touche1.OnEvent();
 //...
}
 
Container::  actiontouche1
{
  //...
 
}


 
Le container est une classe non statique qui contient plusieurs objets de type touche, ce que voudrais arriver a faire c'est à pouvoir affecter a chaque touche une action definie par l'utilisateur dans le container.
Le problème c'est que le compilateur refuse d'affecter la valeur du pointeur, et j'ai absolument besoin que la fonction utilisateur soient un membre du container afin de pouvoir agir sur n'importe quel objet.
 
Mon problème ce situe au niveau du  "touche1.UserFonction=actiontouche1;" le compilateur me jette en indiquant une incompatibilité (compilateur C++ avec juste les fonctions de la norme de base), j'ai éssayé différent ecritures, cast, mais rien a faire ca passe pas, j'ai cru lire quelque chose la dessus avec les delegates, mais ca me semble une usine a gaz et je suis pas tout a fait sur que c'est ce qu'il me faut...
 
Merci d'avance :jap:

Reply

Marsh Posté le 09-09-2005 à 13:56:49   

Reply

Marsh Posté le 10-09-2005 à 00:26:14    

En C++, on utiliserait plutôt le polymorphisme.
Ta conception résulte d'une vision procédurale, héritée du C. A repenser.

Reply

Marsh Posté le 10-09-2005 à 12:56:15    

http://forum.hardware.fr/hardwaref [...] 3190-1.htm
 
tout le monde te remercie d'avoir fait une recherche.

Reply

Marsh Posté le 11-09-2005 à 14:18:57    

capigloo1->
 
Effectivement je me suis remis au c++ il y a pas tres longtemps, mais bon la j'ai p-e trop simplifié mes classes, car en realité j'utilise pas mal le polymorphisme, mais dans mon cas (je crois) ca ne peut pas m'aider.
 
Taz->
 
Je fréquente hfr depuis suffisament longtemps pour connaitre les regles, et quand j'ai fait mes recherche je suis pas tombé dessus , y'a une masse de topic ou les pointeur apparaissent et le moteur de recherche ne permet plus de specifier de date de recherche. Enfin Bref je me suis p-e aussi mal expliqué sur ce que je voulais (désolé), car pour moi ton exemple ne resoud pas mon problème.
 
je vais tenter de reprendre tout ca:
 
J'ai:
 
- une classe "Ecran Globale" qui me permet d'ouvrir, de fermer des fenetres et d'envoyer un evenement a la fenetre active. (les fenetre sont crées dynamiquement, ce ne sont pas des objets statiques!)
 
- une classe "objet de base" qui definit en virtuel toute les fonctions des objets
        - En dérive: une classe "touche"
        - En derive: une classe "fenetre"  
                      - en derive une classe "fenetre util 1","fenetre util 2"... qui peut contenir plusieurs objets touche
 
le but de mon systeme est de garder les classe "ecran" et "fenetre" en fixe et n'avoir qu'a rejouter des fenetres util.
 
Lors d'un evenement, l'objet ecran appelle la fonction correspondante de la fenetre util en cours via une fonction de base de la classe fenetre. Cette fonction parcourt la liste des objets de base la fenetre util et appelle la fonction virtuelle d'appui de touche de l'objet concerné. Jusque la pas de problème tout marche bien.
 
Le probleme est que vu que j'ai pas envie d'avoir a rederiver chaque objet touche pour avoir des actions différente, j'utilise la classe directement dans la fenetre util, mais je veux qu'en plus de la fonction de base d'appui touche il m'en execute une autre définie dans la "fenetre util" qui la contient.
 
Pour ce faire j'avais pensé a mettre dans ma classe de base des pointeur vers des fonction qui seraient affecté lors du constructeur de la fenetre utilisateur.
Le probleme est que si j'ai des modifications a faire sur des autres objets de la fenetre il faut que ce pointeur pointe sur une fonction membre et c'est la que ca passe pas...
 

Citation :


// ma classe de base dont derive tout mes objets
classe ObjBase
{
 
 virtual void OnEvent();           // la fonction d'evenement
 void* UserFonction() ;           // le pointeur vers une fonction utilisateur quelconque
 
}
 
// l'objet fenetre de base
class Objfenetre : ObjBase
{
    ObjList    Items;   //contient des pointeurs vers des ObjBase
 
    void OnEvent()   //la fonction d'evenement
                   {
                      //... //parcourt des objets                    
                    Items.OnEvent();  // appel a la fonction virtuelle de l'objet de base
                     }
}
 
// la fenetre crée par l'utilisateur
class FenetreUser : Objfenetre
{
 
ObjTouche Touche1; //la touche qu'il contient
void AppuiTouche(); //fonction utilisateur lancé lors de l'appui touche
FenetreUser()         //contructeur
                    {
                    Touche1.UserFonction=AppuiTouche;  //affectation de la fonction, c'est la que ca bloque
                    }
}
 
class ObjTouche : ObjBase  
{
 void OnEvent() //la fonction d'evenement
                     {
                      if (UserFonction!=NULL) // si la fonction utilisateur existe...
                           UserFonction();
                      }    
 
}
 
 


 
voila j'espère que mon problème est plus clair :jap:

Reply

Marsh Posté le 11-09-2005 à 19:31:07    

Voir Vol. 1 de "Thinking in C++" de Bruce Eckel:
http://www.janiry.com/bruce-eckel/
Chapitre 11, "Pointers to member functions"

Reply

Marsh Posté le 13-09-2005 à 17:07:52    

:jap: merci je vais regarder ca!

Reply

Marsh Posté le 13-09-2005 à 17:13:58    

on va pas te faire tes devoirs : mon exemple devrait te suffir à comprendre la syntaxe, ce qui représente le seul problème aux pointeurs de fonctions membres

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed