Pointeurs sur fonctions de classes distinctes

Pointeurs sur fonctions de classes distinctes - C++ - Programmation

Marsh Posté le 12-07-2002 à 13:32:04    

mon probleme:
 
j ai besoin d inserer en parametre dans une fonction un pointeur sur fonction; le tout dans un systeme de classe.
 
j ai une classe mere qui dispose de la fonction qui prends le pointeur sur fonction en parametre:

Code :
  1. c_mere
  2. {
  3. public:
  4. void pil(void *fct(union prm[10]), int t);
  5. ...
  6. }


et un ensemble de classe fille:

Code :
  1. c_fille1 : public c_mere
  2. {
  3. public:
  4. init_1();
  5. void do_it_1(union prm[10]);
  6. ...
  7. }
  8. c_fille2: public c_mere
  9. {
  10. public:
  11. init_2();
  12. void do_it_2(union prm[10]);
  13. ...
  14. }


voici mes fonctions que j aimerais bien avoir:

Code :
  1. c_fille1:init_1()
  2. {
  3. pil(do_it_1, 10);
  4. }
  5. c_fille1:init_2()
  6. {
  7. //plus complique:
  8. for (int i = 0; i < 10; i++)
  9.  pil(do_it_2, i);
  10. }


 
en gros j aimerais bien que mon pointeur sur fontion soit declare pour des fonctions appartenant a des classes differentes, mais toutes heritee de la classe "c_mere"
 
La je sais bien que ca marche pas car le pointeur sur fonction n est pas declare correctement, mais j aurais bien voulu pouvoir le declarer comme ca:

Code :
  1. void pil(void *c_mere::fct(union prm[10]), int t);


et que ca marche (on peut toujours rever).
 
----
 
En fait ce systeme sert a avoir une sorte de scenarios pour chaque classe. le programme lance a l instant t la fonction du pointeur. la fonction pil sert a remplir une liste avec pour chaque element une fonction a lancer et un temps associe.
 
----
 
Pour faire au mieux je veut utiliser un pointeur sur fonction avec une classe mere commune a toutes les classes pour pas m embeter a recopier a chaque fois la fonction pil avec la
declaration de pointeurs sur fonctions differentes dans les differentes classes: c est a dire de pas avoir une classe mere, mais recopier dans chaque classe la meme partie
en declarant "pil" pour chaque classe:

Code :
  1. c_fille1
  2. {
  3. public:
  4. init_1();
  5. void do_it_1(union prm[10]);
  6. void pil(void *c_fille1::fct(union prm[10]), int t);
  7. ...
  8. }


Y a plus de chance que ca marche mais ca fait de la recopie! :(
 
 
alors est ce possible d avoir cette classe mere avec ce pointeur sur fonction "commun"
et est ce la meilleure facon de gerer un systeme comme celui que j ai?
 
si vous avez pas compris, demandez et je re-expliquerais!
(j ai l habitude qu on me comprenne pas! ;) )
 
 [:tonyclifton]


---------------
yeaheah... ahhhh.... [:tonyclifton]
Reply

Marsh Posté le 12-07-2002 à 13:32:04   

Reply

Marsh Posté le 12-07-2002 à 13:35:59    

Faut que tu utilise les pointeurs de méthodes virtuelles je pense (me demande pas comment on fait je connais que de nom, jamais essayé)


---------------
Le Tyran
Reply

Marsh Posté le 12-07-2002 à 14:09:49    

>> (j ai l habitude qu on me comprenne pas! ;) )
 
effectivement, je trouve que tu expliques très mal. mets-toi à la place du gars qui veut comprendre, quel genre d'infos veux-tu en premier ? les plus importantes. je penses que tu devrais commencer par dire "je veux faire X, qui utiliserait des Y et des Z". ensuite tu dis "j'ai pensé à l'implémenter comme ça, mais je suis bloqué sur ça".
 
mets des noms plus explicites que pil prm & co, si c'est pour gérer des scénarios appelle tes méthodes executeScenario() par exemple.
 
là, je nage.

Reply

Marsh Posté le 12-07-2002 à 14:15:46    

ok j edite ca de suite! ;)
en esperant que ce soit mieux explique! ;)


---------------
yeaheah... ahhhh.... [:tonyclifton]
Reply

Marsh Posté le 12-07-2002 à 14:34:15    

mon probleme 2:
 
j ai besoin d inserer en parametre dans une fonction un pointeur sur fonction; le tout dans un systeme de classe.
 
j ai une classe mere qui dispose de la fonction qui prends le pointeur sur fonction en parametre:

Code :
  1. union uni
  2. {
  3. double d;
  4. int i;
  5. };
  6. c_mere
  7. {
  8. public:
  9. void put_in_scenario(void (*function)(uni param[10]), int tps);
  10. ...
  11. }


et un ensemble de classe fille:

Code :
  1. c_fille1 : public c_mere
  2. {
  3. public:
  4. init_scenario1();
  5. void execute_fct1(uni param[10]);
  6. ...
  7. }
  8. c_fille2: public c_mere
  9. {
  10. public:
  11. init_scenario2();
  12. void execute_fct2(uni param[10]);
  13. ...
  14. }


voici mes fonctions que j aimerais bien avoir:

Code :
  1. c_fille1:init_scenario1()
  2. {
  3. put_in_scenario(execute_fct1, 10);
  4. }
  5. c_fille2:init_scenario2()
  6. {
  7. //plus complique:
  8. for (int i = 0; i < 10; i++)
  9.   put_in_scenario(execute_fct2, i);
  10. }


 
 
en fait je veut que ca: ca marche! c est a dire que ma fonction put_in_scenario prenne un pointeur sur fonction qui puisse marcher pour des fonctions de classes differentes (ces classes etant heritees publiquement d une meme classe mere,
qui contient la fonction put_in_scenario (qui prend le pointeur sur fontion) en public)...
 
de ce que je sais, ca ne peut pas marcher: car si on veut declarer un pointeur sur fonction
pour une fonction methode d une classe, il faut le declarer en specifiant
la classe de la fonction...
Or ici les classes de ces fonctions ne seront pas toujours les memes... --> probleme!
je me suis dit que ca pourrait peut etre marcher si on declarait ce pointeur de fonctions
 comme faisant partie de la classe mere. Donc le declarer ainsi:
 

Code :
  1. void c_mere::(*function)(uni param[10])


mais je suis pas sur que ca marche! :(


---------------
yeaheah... ahhhh.... [:tonyclifton]
Reply

Marsh Posté le 12-07-2002 à 14:54:28    

TonyClifton a écrit a écrit :

...


visiblement je m'exprime très mal, quand je disais "X avec Y et Z" c'était de l'ordre "je fais un jeu de rôle, je veux gérer plusieurs scénarios avec une même classe et les appeler à différents moments lors d'une mission". bref, des infos "haut niveau".
 
>> mais je suis pas sur que ca marche
 
essaye ! :lol:
 
//
 
ça me semble quand même plus simple de faire une classe 'executer' qui se charge d'éxécuter un bout de code :
 
class executer
{
  virtual void execute() = 0;
};
 
class executerTest : executer
{
  void execute() { printf("test" ); }
}
 
class mere
{
  bool ajouteExecuter(executer* e)
}
 
mereInstance->ajouteExecuter(e)
 
bref. donne plus d'infos sur ce que tu veux faire ... pour le moment ta méthode ne me semble pas très appropriée.

Reply

Marsh Posté le 12-07-2002 à 15:12:26    

je t explique ce que je veut faire dans mon programme:
 
c est de la 3d (avec OpenGL):
Je veut avoir plusieurs "objets" dispose dans l espace, ces objets correspondant chacun a une instance d une certaine classe.
Je veut que ces objets se deplace et varie dans leur forme selon un scenario preetabli.
 
j ai donc penser a un systeme de fonctions dans ces classes qui serait appele a un temps t et qui ferait varier les parametres de l instance de la classe.
Ainsi l objet se reaffiche a chaque fois selon ses propres parametres qui peuvent varies dans le temps.
Ces fonctions serait initialise dans une liste (scenario) au debut du programme, puis parcourue pour executer ces fonctions au moment ou il faut.
Ce qui nous fait un scenario pour chaque instance de classe, ce qui fait que j ai choisis d avoir une classe mere a tous ces "objets" car tous ont des methodes communes: la gestion du scenario.
Et la arrive mon probleme de pointeur sur fonction car la fonction le prenant en parametre est declaree dans ma classe mere mais prendra en parametres des fonctions des classes filles (donc de differentes classes) donc: est ce qu on declarer un pointeur sur fonctions qui peut marcher avec differentes classes!


---------------
yeaheah... ahhhh.... [:tonyclifton]
Reply

Marsh Posté le 12-07-2002 à 15:21:37    

Tu fais un tableau de pointeur vers des méthode membre pour chaque sous classe et une méthode virtuelle pure qui va aller piquer dans ce tableau à l'instanciation de l'objet


---------------
Le Tyran
Reply

Marsh Posté le 12-07-2002 à 15:55:39    

Citation :


Tu fais un tableau de pointeur vers des méthode membre pour chaque sous classe et une méthode virtuelle pure qui va aller piquer dans ce tableau à l'instanciation de l'objet  


 
euhhh.. t as pas un pitit bout de code d exemple?  :heink:


---------------
yeaheah... ahhhh.... [:tonyclifton]
Reply

Marsh Posté le 12-07-2002 à 16:15:35    

TonyClifton a écrit a écrit :

Citation :


Tu fais un tableau de pointeur vers des méthode membre pour chaque sous classe et une méthode virtuelle pure qui va aller piquer dans ce tableau à l'instanciation de l'objet  


 
euhhh.. t as pas un pitit bout de code d exemple?  :heink:  




 
Si j'ai bien compris ce que tu veux faire je farai un truc comme ça:
 

Code :
  1. class mere
  2. {
  3.   public:
  4.           mere();
  5.           virtual ~mere();
  6.           virtual selection() = 0;
  7.           virtual modifier() = 0;
  8. };
  9. class fille : mere
  10. {
  11.     public:
  12.             fille();
  13.             virtual ~fille();
  14.             virtual selection()
  15.              {
  16.                //Selection des modification
  17.              }
  18.            virtual modifier()
  19.             {
  20.               //Faire les changement de forme  
  21.             }
  22.           static void (*modifs)(fille *)[];
  23.           static void modif1(fille *);
  24.           static void modif2(fille *);
  25.          //autres méthodes de modification
  26. }
  27. void (*fille::modifs)(fille *)[] = { fille::modif1, fille::modif2};


---------------
Le Tyran
Reply

Sujets relatifs:

Leave a Replay

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