Vous ne pouvez pas charger les classes au moment de l'exécution car C++ est un langage compilé et les classes n'existent pas au moment de l'exécution. Objets (instances de classes) font.
Ce que vous pouvez faire est de charger les bibliothèques partagées au moment de l'exécution et de les faire créer des objets d'une certaine interface.
Une implémentation de plug-in minimale définirait l'interface de votre plug-in et l'interface de la fonction d'usine qui va créer des objets avec cette interface. Vous allez charger la bibliothèque partagée à l'exécution, trouver la fonction d'usine avec un certain nom et appeler la fonction d'usine pour créer un objet. Ensuite, vous utilisez cet objet via l'interface:
// plugin.h start
#include <memory>
struct PlugIn // interface
{
virtual ~PlugIn() = 0;
virtual void doSomething() = 0;
};
extern "C" {
typedef std::auto_ptr<PlugIn> PlugInFactoryFn();
// A plugin .so must export this one factory function.
std::auto_ptr<PlugIn> createPlugIn();
}
// plugin.h end
// somewhere in you application
#include "plugin.h"
#include <assert.h>
#include <dlfcn.h>
std::auto_ptr<PlugIn> loadPlugIn(char const* filename)
{
void* so = dlopen(filename, RTLD_NOW | RTLD_LOCAL);
assert(so);
void* factory_function = dlsym(so, "createPlugIn");
assert(factory_function);
return reinterpret_cast<PlugInFactoryFn*>(factory_function)();
}
int main()
{
std::auto_ptr<PlugIn> a(loadPlugIn("a.so"));
std::auto_ptr<PlugIn> b(loadPlugIn("b.so"));
a->doSomething();
b->doSomething();
}
Vous avez publié vos solutions proposées pour un problème que vous n'avez pas indiqué. Quelles sont vos exigences? –