Méthode de chargement dynamique de fonctions
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:
Code:
1 2 3 4 5 6 7 8 9
| #if _BLIB_FOUND
#include "blib.h"
class B : public A
{
...
};
#endif |
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.
Ma première approche fut de faire un "vulgaire" switch de la manière suivante:
Code:
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;
}
} |
Seulement voilà... ca ne compilera seulement si l'utilisateur possède toutes les bibliothèques dépendantes...
Voici ma nouvelle idée: charger les méthodes (à savoir ici les constructeurs de classes) de manière dynamique.
Code:
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);
}
} |
Mon problème c'est comment instancié cette méthode (loadClass). Est-ce possible?
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.