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()
Partager