2013-05-11 8 views
6

Im ancora un po 'nuovo per il C++, quindi sopportare la mia noia.C++ Caricare dinamicamente le classi

Quello che voglio è essere in grado di consentire all'utente del mio programma di essere in grado di aggiungere le proprie classi. Ho una classe astratta Module e la mia applicazione consiste in un set di sottoclassi di Module.

È possibile cercare una determinata directory e caricare dinamicamente sottoclassi di Module (aggiunte dall'utente)?

In Java, è possibile ottenere ciò utilizzando l'API org.reflections. Immagino che l'equivalente C++ stia usando le DLL. Potrei sbagliarmi.

Grazie in anticipo.

+2

Sì, è possibile utilizzare libreria di collegamento dinamico shread. Sarebbe piattaforma spercifica, di causa. Puoi prendere in considerazione l'uso di 'Qt' ([Qt plugins] (http://qt-project.org/doc/qt-4.8/plugins-howto.html)) o di qualche altro sistema di plugin. – Lol4t0

risposta

5

Per quanto ne so, il modello di compilazione C++ non ha un modo diretto ed esplicito di "esportazione delle classi". Tuttavia, si dovrebbe essere in grado di farlo con un semplice C-interfaccia:

#include "MyModule.h" 

// class MyModule inherits Module 

extern "C" Module * create_module() { return new MyModule; } 
extern "C" void free_module(Module * p) { delete p; } 

Ora è possibile caricare dinamicamente quella biblioteca e recuperare le funzioni create_module e free_module, e aggiungere i loro puntatori a funzione in modo dinamico al sistema:

std::map<std::string, std::pair<Module * (*)(), void(*)(Module *)> plugins; 

plugins["MyClass"] = std::make_pair(..., ...); // the dynamically resolved 
               // function addresses 

In effetti, probabilmente non è nemmeno necessaria la funzione di distruttore, poiché la normale macchina di distruttore virtuale dovrebbe funzionare anche nelle librerie caricate dinamicamente.

Ad esempio:

std::unique_ptr<Module> make_module(std::string const & s) 
{ 
    auto it = plugins.find(s); 

    return { it == plugins.end() ? nullptr : it->second.first() }; 
}