Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2780 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Héritage et plugin

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Héritage et plugin

n°1324806
Riot
Buy me a riot
Posté le 14-03-2006 à 09:55:05  profilanswer
 

Salut !
 
Mon projet consiste en une série d'héritage de classes : la classe C hérite de la classe B, qui elle-même hérite de la classe A (C ->
B -> A).
À chaque fois que l'on descend dans l'héritage, j'ajoute des méthodes plus spécifiques.
Dans mon projet, je dois facilement ajouter de nouvelles fonctions, je me suis donc tourné vers l'utilisation de plugins (dlopen, etc...).
Dans mon cas, les plugins sont donc des implémentations des classes B et C.
Mon problème survient lors de l'instanciation des plugins : puisque seule la classe A est connue de mon système de plugin, les nouvelles méthodes implémentées dans les classes B et C ne sont pas instanciables.
Existe-t-il une solution à ce problème ?
Ou bien dois-je obligatoirement utiliser les mêmes méthodes, mais pas forcément implémentées de la même manière ?
 
Merci d'avance.

mood
Publicité
Posté le 14-03-2006 à 09:55:05  profilanswer
 

n°1325885
Taz
bisounours-codeur
Posté le 15-03-2006 à 15:21:11  profilanswer
 

je vois pas comment tu fais pour utiliser directement B::foo quand t'as un A*/A& ... donc je ne vois pas le problème.

n°1326498
Riot
Buy me a riot
Posté le 16-03-2006 à 09:48:52  profilanswer
 

Hu !
 

Code :
  1. A.hpp :
  2. -------
  3. class A
  4. {
  5. T _huhu
  6. public:
  7. A(T huhu) : _huhu(huhu) {};
  8. virtual ~A() {};
  9. virtual void compute() = 0;
  10. };
  11. typedef A* createPluginA();


 

Code :
  1. B.hpp :
  2. -------
  3. class B : public A
  4. {
  5. protected:
  6. T2 _haha
  7. public:
  8. B(T huhu, T2 haha) : A(huhu), _haha(haha) {};
  9. virtual ~B() {};
  10. virtual void compute();
  11. virtual void pouet();
  12. };
  13. B.cpp :
  14. -------
  15. void B::compute()
  16. {
  17. cout << "compute" << endl;
  18. }
  19. void B::pouet()
  20. {
  21. cout << "pouet" << endl;
  22. }
  23. extern "C"
  24. {
  25. A* createA(T huhu, T2 haha)
  26. {
  27.   return new B(huhu, haha);
  28. }
  29. }


 

Code :
  1. main.cpp :
  2. ----------
  3. #include "A.hpp"
  4. A* loadPluginA(T huhu, T2 haha)
  5. {
  6. void* handle = dlopen("libB.so", RTLD_NOW | RTLD_GLOBAL);
  7. if(handle){
  8.   createPluginA* create = (createPluginA*) dlsym(handle, "createA" ); 
  9.   if(create)
  10.   {     
  11.    return create(huhu, haha); 
  12.   }
  13.   dlclose(handle);
  14. }
  15. }
  16. int main(int argc, char* argv[])
  17. {
  18. A* b = loadPluginA(huhu, haha);
  19. b->pouet(); //marche pas ^^, et c'est normal! Mais comment faire ?
  20. return 0;
  21. }


Message édité par Riot le 16-03-2006 à 09:49:32
n°1326506
smaragdus
whores, drugs & J.S. Bach
Posté le 16-03-2006 à 10:05:24  profilanswer
 

Citation :

A* b = loadPluginA(huhu, haha);
b->pouet(); //marche pas ^^, et c'est normal! Mais comment faire ?


 
Bah définir pouet() en méthode virtuelle dans A [:spamafote]


Message édité par smaragdus le 16-03-2006 à 10:05:39
n°1326540
Riot
Buy me a riot
Posté le 16-03-2006 à 11:07:52  profilanswer
 

Nan j'veux pas ! :o
Dans mon précédent post, j'ai simplifié les choses en ne mettant que 2 classes, normalement il peut encore y avoir de l'héritage derrière (et donc de nouvelles méthodes).

n°1326541
chrisbk
-
Posté le 16-03-2006 à 11:09:02  profilanswer
 

ton design doit pas etre bon

n°1326544
Taz
bisounours-codeur
Posté le 16-03-2006 à 11:13:20  profilanswer
 

écoute, si tu compiles "x->pouet()" alors pouet doit être déclaré à la compilation.
 
avec ton système, si je fais un plugin avec une méthode x->pilu() :
- comment fait-on pour l'appeler ?
- qui décide de l'appler ?
- elle est appelée comment ?  
 
 
c'est pas la peine de faire de l'héritage si tu fais pas de polymorphisme. Un plugin, c'est un bout de code chargeable à la demande qui fournit une interface. Si quelque chose n'est pas dans l'interface, ça n'est pas utilisable.

n°1326558
Riot
Buy me a riot
Posté le 16-03-2006 à 11:28:37  profilanswer
 

J'ai pas dit que j'avais bien écrit mon bordel.
Je vous dit que ce que j'ai écrit ne marche pas pour ce que je veux, et j'aimerais trouver un moyen de faire ce que je veux.
Alors avez-vous une idée ?

n°1326560
_darkalt3_
Proctopathe
Posté le 16-03-2006 à 11:33:20  profilanswer
 

le réécrire de la bonne manière [:spamafote]

n°1428415
Creak
Posté le 21-08-2006 à 10:27:11  profilanswer
 

J'ai l'impression que tu pourrais résoudre ton probleme grace au design pattern Visitor.
http://en.wikipedia.org/wiki/Visitor_pattern
 
la seule chose que tu as à rajouter dans ta classe mère est la fonction accept(Visitor *), en virtual, bien entendu.
Ensuite tu cré une classe abstraite Visitor qui à une methode visit() par classe de ton design (classe A, B, C). Chaque méthode visit prendra une classe différente.
Et dans le accept de chacune des classes, tu mets ce que tu veux mettre...
Tu pourrais donc faire une classe VisitorInitPlugin qui initialise chacun des plugins, par exemple...
 
Je suis pas sûr que le design colle parfaitement à ton probleme, mais ça vaut peut être le coup d'essayer! :)
 
Edit> je viens de voir cela sur dlopen et le C++, c'est assez intéressant... http://www.tldp.org/HOWTO/C++-dlopen/theproblem.html


Message édité par Creak le 21-08-2006 à 10:35:33
mood
Publicité
Posté le 21-08-2006 à 10:27:11  profilanswer
 

n°1428427
Taz
bisounours-codeur
Posté le 21-08-2006 à 10:51:41  profilanswer
 

visitor ça change rien. Il faut appeler la même méthode A::accept. Tu pouras jamais appelé B::machin ...

n°1428518
retrox
Posté le 21-08-2006 à 12:08:07  profilanswer
 

RTTI ? (j'ai pas dit que c'était beau :o)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Héritage et plugin

 

Sujets relatifs
[Merise] Héritage ou pas ?Pb: telechargement plugin java en html lors du lancement d'une applet
Plugin Eclipse : lier Action et WizardInterface VS héritage....
[Résolu] Problème d'héritage d'héritage + redéfinition de méthode[resolu] Plugin Visual Editor ne fonctionne pas.
pb plugin eclipse[Eclipse] Comment ajouter un listener au démarrage d'un plugin?
probleme eclipse (+plugin SOA, worflow pi4soa)probleme d'héritage
Plus de sujets relatifs à : Héritage et plugin


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR