Вы не можете загружать классы во время выполнения, так как C ++ является скомпилированным языком, а классы не существуют во время выполнения. Объекты (экземпляры классов) делают.
Что вы можете сделать, это загрузить разделяемые библиотеки во время выполнения и заставить их создавать объекты определенного интерфейса.
Минимальная реализация плагина будет определять интерфейс вашего плагина и интерфейс фабричной функции, которая будет создавать объекты с этим интерфейсом. Вы собираетесь загрузить разделяемую библиотеку во время выполнения, найти фабричную функцию с определенным именем и вызвать фабричную функцию для создания объекта. Затем вы используете этот объект через интерфейс:
// 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();
}