Bonjour tout le monde!
Je vous explique rapidement le but de ce sujet: je dois produire une bibliothèque statique qui contient une classe abstraite A et plusieurs classes filles (B, C, D). Chacune de ces classes filles dépendent de bibliothèques différentes les unes des autres (BLib, CLib, DLib).
Le problème est le suivant: chez certains utilisateurs, les bibliothèques des classes filles ne seront pas disponibles donc il ne pourront pas compiler ma bibliothèque. Pour parer ce problème j'ai utilisé des instructions préprocesseur pour indiquer si une bibliothèque fille est présente ou non:
Avec cette méthode, la bibliothèque peut compiler sans problème. Seulement voilà, maintenant, il faudrait que j'ai une fabrique à laquelle je passe en paramètre le nom de la classe fille et qui m'instancie la classe correspondante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #if _BLIB_FOUND #include "blib.h" class B : public A { ... }; #endif
Ma première approche fut de faire un "vulgaire" switch de la manière suivante:
Seulement voilà... ca ne compilera seulement si l'utilisateur possède toutes les bibliothèques dépendantes...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 void buildClass(int className, A* returnClass) { switch (className) { case 0: returnClass = new B(); break; case 1: returnClass = new C(); break; case 2: returnClass = new D(); break; default: cerr << "Class not defined" << endl; } }
Voici ma nouvelle idée: charger les méthodes (à savoir ici les constructeurs de classes) de manière dynamique.
Mon problème c'est comment instancié cette méthode (loadClass). Est-ce possible?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 void buildClass(std::string className, A* returnClass) { //Permet de charger une méthode qui construit un objet. void* classMetod = loadClass(className); if(!returnClass) { cerr << "Class not defined" << endl; } else { //Cree l'objet de type className. classMethod(returnClass); } }
Je sais que ce genre de fonction existe notamment en openGL avec la méthode glxGetProcAdress mais je ne trouve pas son implémentation.
Si vous avez une idée, je suis tout à fait preneur!
Merci d'avance.
Partager