généralement vous liez contre quelque chose, ce greffon de liens avec les bibliothèques de base, car il a besoin de savoir sur la mise en œuvre de base pour fonctionner, le lien implicite n'existe pas, il n'y a pas connaissance du plug-in A l'intérieur de base (et il ne devrait pas y avoir) donc le noyau ne connaît pas le plugin A ou B, et cela signifie que les plugins B et A ne se connaîtront pas les uns les autres sans se lier les uns aux autres. Dans ce type de modèle, vous voulez le garder indifférent entre les plugins et utiliser des interfaces ou des classes abstraites pour communiquer. (par exemple si un plugin hérite de Core avec des fonctions virtuelles pures, un autre plugin peut contenir un pointeur dessus, et appeler des fonctions sans connaître l'implémentation complète)
généralement vous liez quelque chose, alors plugin A liens contre Bibliothèque de base car elle doit connaître l'implémentation de base pour fonctionner, le lien implicite n'existe pas, il n'y a pas de connaissance du plugin A à l'intérieur de Core (et il ne devrait pas y avoir) donc le noyau ne connait pas le plugin A ou B signifie que les plugins B et A ne se connaîtront pas les uns les autres sans se lier les uns aux autres.
Modifier pour commenter:
Dans ce cas, vous pouvez utiliser les interfaces, les plug-ins qui héritent. donc dans la bibliothèque de base, vous créez une classe appelée ITerminal, qui possède un ensemble de fonctions virtuelles (Update, Init, Connect, Open, tout ce dont vous avez besoin) sans implémentation, puis pluginA peut en hériter et donner les fonctions implémentations . De cette façon, d'autres plugins peuvent contenir un handle pour ITerminal et appeler des fonctions sans connaître les détails de pluginA. pour le créer vous avez besoin d'une usine par exemple Core :: CreateTerminal, qui retournera un ITerminal (ITerminal * object = new PluginA();) maintenant pluginB peut appeler Core :: CreateTerminal, ce qui leur donne un handle pour ITerminal qui a une implémentation que Core a choisi dans ce cas. Pour développer cela, vous pouvez faire en sorte que les plugins s'inscrivent au noyau, donc le noyau appelle simplement une fonction create dans le plugin, par exemple pluginA peut s'inscrire en tant que classe ITerminal, alors quand CreateTerminal est appelé, il appelle le plugin objet. De cette façon, vous pouvez échanger des plugins dedans et dehors (avoir des terminaux différents sans changer de Core ou d'autres plugins)
"Je ne sais pas ce qui se passe exactement quand les symboles sont résolus" - quelque chose pour vous de lire là-bas .. –
ces implicite les liens n'ont aucun sens – VTT
Les plugins sont-ils chargés dynamiquement à l'exécution, ou statiquement au moment de la compilation par l'éditeur de liens? Ce n'est pas clair à cause de votre question. – 1201ProgramAlarm