IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

les classes et les templates dans les plugins


Sujet :

C++

  1. #21
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Tu comprendras peut-être mieux si on sépare l'interface de l'implémentation.

    Avec le code suivant, la bibliothèque expose une instance de template. Mais le main n'en a aucune idée, tout ce qu'il peut voir, c'est une interface non-template.
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //IAffiche.h
    class IAffiche
    {
    public:
    	virtual void Afficher(void) const = 0;
    	virtual void Detruire(void) = 0;
     
    protected: ~IAffiche() {} //Destruction polymorphique par delete interdite.
    };
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    //DLL.cpp
     
    #include "IAffiche.h"
    #include <iostream>
     
    template< class classTest = int >
    class Affiche : public IAffiche
    {
    	classTest i;
    public:
    	virtual void Afficher(void) const
    	{
    		std::cout << i << std::endl;
    	}
    	virtual void Detruire(void)
    	{
    		delete this;
    	}
    };
     
    extern "C" IAffiche* fct( void ) {
    	return  new Affiche< int >();
    }
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    //main.cpp
     
    #include <iostream>
    #include <dlfcn.h>
    #include "IAffiche.h"
     
    using namespace std;
     
    typedef IAffiche* ( * FCT ) ( void );
     
    int main( void ) {
    	void* dlobj;
     
    	if( dlobj = dlopen( "test.so", RTLD_LAZY ) ) {
     
    		// test d'une classe dans une dll
    		FCT fct_dll = ( FCT ) dlsym( dlobj, "fct" );
     
    		IAffiche* obj = fct_dll();
    		obj->Afficher();
    		obj->Detruire(), obj=NULL;
    	}
    	return 0;
    } // main()

  2. #22
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Tu peux aussi exporter une instance précise d'une interface template:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //IGet.h
     
    template< class T >
    class IGet{
    public:
    	virtual I Get(void) const = 0;
    	virtual void Detruire(void) = 0;
     
    protected: ~IGet() {} //Destruction polymorphique par delete interdite.
    };
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    //DLL.cpp
     
    #include "IAffiche.h"
    #include <iostream>
     
    template< class classTest = int >
    class Affiche : public IAffiche, public IGet< classTest >
    {
    	classTest i;
    public:
    	virtual void Afficher(void) const
    	{
    		std::cout << i << std::endl;
    	}
    	virtual void Detruire(void)
    	{
    		delete this;
    	}
    	virtual classTest Get(void) const
    	{
    		return i;
    	}
    };
     
    extern "C" IAffiche* fct( void ) {
    	return  new Affiche< int >();
    } 
    extern "C" IGet<int>* fct2_int( void ) {
    	return  new Affiche< int >();
    }
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    //main.cpp
     
    #include <iostream>
    #include <dlfcn.h>
    #include "IGet.h"
     
    using namespace std;
     
    typedef IGet< int >* ( * FCT2_INT ) ( void );
     
    int main( void ) {
    	void* dlobj;
     
    	if( dlobj = dlopen( "test.so", RTLD_LAZY ) ) {
     
    		// test d'une classe dans une dll
    		FCT2_INT fct2_int_dll = ( FCT2_INT ) dlsym( dlobj, "fct2_int" );
     
    		IGet< int >* obj = fct2_int_dll();
    		int i = obj->Get();
    		obj->Detruire(), obj=NULL;
    	}
    	return 0;
    } // main()
    Par contre, tu ne peux pas exporter un template non-instancié.
    Pour la DLL, toutes les instances possibles doivent être connues à la compilation de la DLL.

    Et puis, il y a aussi le problème pour la création: Il faudrait que la DLL exporte une fonction template pour créer l'objet...

  3. #23
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 217
    Points : 107
    Points
    107
    Par défaut
    Merci beaucoup Médinoc.
    tout de suite, c'est plus clair.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/09/2011, 14h50
  2. Réponses: 0
    Dernier message: 29/08/2010, 04h37
  3. Réponses: 1
    Dernier message: 08/08/2008, 17h12
  4. Réponses: 15
    Dernier message: 15/04/2008, 14h25
  5. Récupérer les infos que Eclipse récupere dans les .Class
    Par bortizki.dua dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 25/01/2008, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo