J'essaye d'ajouter une capacité de plugin à ma base de code C++. La difficulté vient du fait que les plugins doivent contenir de la plomberie que le plugin ne doit pas connaître (en gardant ainsi le fichier include simple). Donc, voici la configuration:Système de plugins C++ où les plugins héritent de la classe de base
"PluginBase.h". C'est la classe dont le plugin hériterait.
class PluginBase {
virtual void PluginProcess() = 0; // the plugin-specific capability
};
"PluginPlumbing.h". La classe qui contient la plomberie.
class PluginPlumbing : public PluginBase {
void PlumbingFunction() {
// Some stuff
PluginProcess();
// Some more stuff
}
};
Le code-cadre extérieur serait (en chargeant la DLL/donc du plug-in) acquérir un pointeur vers une instance de la classe PluginPlumbing, puis appelez PlumbingFunction() sur elle. Cependant, l'énigme que j'ai est, je ne peux pas simplement upcast un pointeur de PluginBase que je reçois de la DLL/ainsi à un pointeur de PluginPlumbing car il ne hérite pas clairement de PluginPlumbing. Et je ne peux pas avoir le plugin hérité de PluginPlumbing, parce que je suis de retour à la première place d'exposer la plomberie à l'auteur de plugin.
La seule solution que je peux imaginer est que, au lieu de bien hériter, le PluginBase et le PluginPlumbing sont des classes entièrement séparées. Le PluginBase serait instancié par la DLL/so, et l'instance de PluginPlumbing serait instanciée par le framework, et a donné ce pointeur PluginBase pour qu'il puisse faire les appels de plomberie. Est-ce la seule solution pour y arriver?