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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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()
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  2. #22
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #23
    Membre �clair�
    Inscrit en
    D�cembre 2005
    Messages
    217
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 217
    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