2010-12-14 70 views
3

J'utilise la bibliothèque partagée avec une liaison explicite (chargement de la librairie partagée avec dlopen) afin de mettre en œuvre le modèle de plugin en C++. Est-il possible de définir un pointeur de fonction à un constructeur d'une classe définie dans la bibliothèque partagée ou je devrais définir une méthode factory, dans lib libérée, qui instancierait (et initialiserait) l'objet d'une classe à partir d'une librairie partagée ? Bien sûr, dans mon application principale, je définirais un pointeur de fonction vers une méthode usine, et cette méthode retournerait une instance de la classe dont j'ai besoin.Est-il possible de définir un pointeur de fonction sur un constructeur?

Vive

+1

Sous Windows, vous pouvez utiliser __declspec (dllexport/dllimport) pour exporter et importer des constructeurs (et en fait des classes entières). Serait intéressant de vérifier la documentation du compilateur pour votre compilateur pour voir si elle offre quelque chose de similaire. – Puppy

+0

Sur Linux, tout est exporté par défaut et vous pouvez simplement créer un lien vers tout ce que vous voulez. Mais il utilise une liaison explicite (pensez à LoadLibrary/GetProcAddress dans WinAPI) et honnêtement, je n'ai aucune idée de la façon de gérer les constructeurs dans de tels cas. C'est une bonne question. –

Répondre

6

La réponse à la question est non, vous ne pouvez pas définir un pointeur de membre ou d'une fonction au constructeur. Pour dlopen, vous devez fournir une fonction avec c linkage et le charger dynamiquement, que vous pouvez utiliser pour créer les objets, et vous avez également besoin d'une autre fonction pour supprimer les objets.

Pour en savoir plus here

+0

Un très bon article! Ce que j'ai le plus aimé, c'est qu'il recommande d'utiliser des interfaces de base avec des fonctions virtuelles pures. Il est clair que c'est la meilleure façon d'implémenter des plugins. –

1

vous aurez besoin de connaître le nom des problèmes mutiler lors de la récupération des pointeurs avec dlsym(). Ce n'est pas une bonne idée de s'appuyer sur une méthode de mangling spécifique, ils sont tous trop diversifiés. Donc, la seule chose raisonnable à faire est d'exposer votre interface de plugin comme extern "C" {...}, avec des wrappers de fonctions usine sur les constructeurs.

+0

je suis d'accord. C'est comme ça que je les utilise. Merci –