[Linux] Bibliothèque dynamique

Bibliothèque dynamique [Linux] - C++ - Programmation

Marsh Posté le 05-08-2008 à 18:05:01    

Bonjour,
 
J'utilise Linux et g++.
 
Je voudrais générer une bibliothèque dynamique qui permette de créer des objets hérités. Je m'explique :
 
Dans un fichier principal appelé main.cpp, il y aurait la definition d'une classe A qui utilise une classe B, ...
Dans ce meme fichier, il y aurait un appel à une une fonction externe "invoke_classA()" qui renvoie un pointeur sur classe A.
 
Dans le fichier de la librairie dynamique, il y aurait la definition de la fonction "invoke_classA()" ainsi que la définition d'autres classes héritant de A. Ma fonction renverrait un pointeur sur l'une d'elles.
 
Pour schémitiser, on aurait :
main.cpp:
 
classe A
{
   private :
      B elt;
      int number;
 
   public :
      A();
      ~A();
      void set_number(int num);
};
 
A::A() {}
A::~A() {}
void A::set_number(int num) {this->number = num;}
 
 
Et le fichier lib_shar.cpp
class A2 : public A1
{
   public :
      A2();
      ~A2();
      void set_3();
};
 
A2::A2() : A1() {}
A2::~A2() : ~A1() {}
void A2::set_3() {this->set_number(3);}
 
 
Et j'aimerais pouvoir compiler ces 2 fichiers séparement sans avoir à donner à la bibliothèque dynamique la definition de toutes les classes utilisées (Dans l'exemple, il faudrait donner A et B).
 
Est ce que c'est possible ?
 
Merci

Reply

Marsh Posté le 05-08-2008 à 18:05:01   

Reply

Marsh Posté le 05-08-2008 à 18:37:19    

Je suppose que la classe A2 herite de A directement ou indirectement (tu utilises A1 qui n'est pas defini).  Non, ce n'est pas possible.  Pour definir une classe, il faut voir la definition de ses classes de base.

Reply

Marsh Posté le 05-08-2008 à 19:29:20    

Merci pour la réponse. Ca veut dire qu'il faut intégrer 2 fois le code des classes parents, dans la bibliothèque dynamique et dans le programme principal ? C'est dommage ca. Pourtant, je ne vois pas pourquoi les fichiers headers ne sont pas suffisants (le reste peut etre retrouvé lors de l'edition de liens dynamique) ??


Message édité par hwoarangmy le 05-08-2008 à 19:30:27
Reply

Marsh Posté le 05-08-2008 à 19:31:56    

personnellement j'évite d'exporter des classes et je passe par des fonctions libres qui créent/détruisent la classe. Après,une petite interface à la COM pour savoir qui je dois créer en fonction des paramètres et zou :o

Reply

Marsh Posté le 05-08-2008 à 21:00:01    

Salut,
 
Sur le principe, je suis d'accord mais l'interet, c'est de pouvoir changer la librairie dynamiquement pour pouvoir créer des classes qui n'existent pas au moment ou le programme principal est écrit. Ceci dit, je trouve étonnant (voir dansgereux) qu'il faille dupliquer les classes comme ca (et risquer de les désynchroniser)...

Reply

Marsh Posté le 05-08-2008 à 21:54:38    

on est d'accord aprés c'est un choix. Perso mes plugins dynamiques ils viennent avec un mini XML qui décrit les classes dedans et quand je charge un plugin, j'appelle en premier lieu une fonction qui lit le XML et me remplit ce qu'il faut pr creer les instances qui vont bien.

Reply

Marsh Posté le 05-08-2008 à 22:46:46    

Merci pour la réponse. Tu utilises un moteur particulier pour parser le xml et créer les classes ?

Reply

Marsh Posté le 06-08-2008 à 08:06:14    

boost::serialization pour la partie XML<->classe

Reply

Marsh Posté le 06-08-2008 à 09:36:51    

Merci. J'ai essayé de regarder de ce coté mais je n'ai trouvé que des tutoriaux ou la serialization est utilisée pour sauver des données dans des fichiers. Est ce que tu connais des tutoriaux ou ils sont utilisés comme plugins ou est ce que tu aurais un bout de code simple pour comprendre ?
 
Merci

Reply

Marsh Posté le 06-08-2008 à 19:46:51    

j'ai rien là 'est au bureau ou dans les archives. des que j'ai 5 mn je cherche ça ;)

Reply

Marsh Posté le 06-08-2008 à 19:46:51   

Reply

Marsh Posté le 06-08-2008 à 21:10:49    

Joel F a écrit :

j'ai rien là 'est au bureau ou dans les archives. des que j'ai 5 mn je cherche ça ;)

Merci beaucoup :D

Reply

Marsh Posté le 06-08-2008 à 21:17:28    

De tête ce que je serialize c'est une classe qui contient la liste des nom des plugins contenant certaines classes (en gros je serialize une map). La première chose que je fais quand je charge bob.so c'est d'appeler la fonction get_registered_elements qui prend en param une map dans laquelle je deserialize bob.xml. Ensuite, cette map est utilisé apr une abtract factory qui sait que si bob.so contient les classe A,B et Foo, les fonction create_A, create_B et create_Foo existe et trouve leur liste de paramètres de constructeurs dans le xml. Ensuite j'attaque cette factory pour instancier/détruire des instances de A,B,Foo etc ...

Reply

Marsh Posté le 07-08-2008 à 08:56:10    

La, ca devient un petit peu trop compliqué sachant que je ne maitrise pas tous les concepts. Mais effectivement, ca a l'air proche de ce que je cherche. Est ce que tu aurais une source simple ou un tutorial la dessus ?
 
Merci

Reply

Marsh Posté le 09-08-2008 à 11:04:07    

Bonjour,
 
   Je suis ce topic car pour ma culture je suis pas mal intéressé par le design que tu propose Joel F. J'ai donc fait des petites recherches et je suis tombé sur ça :
http://hiko-seijuro.developpez.com [...] dynamique/ . Si j'ai bien compris, ce que tu propose c'est ce qui est présenté dans la seconde partie de l'article sauf qu'au lieu de remplir la map en dur dans le code tu la charge dynamiquement depuis un .xml en utilisant boost::serialization. C'est ça ?
 
Merci pour le partage de connaissances :)

Reply

Marsh Posté le 09-08-2008 à 11:47:18    

en gros oui. Je peut pas en filer plus pour plein de raisons professionnelles :o mais y a tout dans ce lien. Le lien avec serialization est assez trivial à mettre en oeuvre

Reply

Marsh Posté le 09-08-2008 à 13:01:37    

ok, merci

Reply

Sujets relatifs:

Leave a Replay

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