Bonjour,
imaginons que nous travaillons sur une biblioth�que. Nous voulons donc, id�alement, exporter un seul en-t�te qui propose le protocole (ensemble des fonctions et variables publiques) et cacher l'impl�mentation en elle m�me.
Pour ce faire, rien de tel qu'un classique pimpl:
Vous noterez la pr�sence de cette variable membre priv�e: a_super_important_value. Elle est type int.
Code : 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 /***** my_lib.h ********/ class MyLibImpl; class MyLib { public: // protocol void DoSomething(); // ... private: MyLibImpl * pimpl_; // pimpl: tout sera implémenté dans cette classe int a_super_important_value; }; /***** my_lib.cpp ********/ #include "my_lib.h" #include "my_lib_impl.h" void MyLib::DoSomething() { pimpl->DoSomething(); }
Donc imaginons que nous avons impl�ment� notre lib, que �a marche qu'on est pr�t � lancer des tests en pr�-prod. Et l�, subitement, le commercial nous appelle et nous explique que finalement, cette super_important_value ne sera pas forc�ment un entier, mais d'un type ind�termin� (donc pas forc�ment natif) que le client doit pouvoir choisir. Les commerciaux sont tr�s forts, et dans cette situation hypoth�tique, nous nous sommes laiss� convaincre, sans m�me s'en rendre compte, que c'�tait une bonne id�e, et c'�tait pas bien grave de pr�venir alors que le code �tait finit.
Ok donc, pas de probl�me, gr�ce au c++ on peut tout faire. Pour ce probl�me l�, on a les templates. Je vais transformer ma classe en template et �a va rouler tout seul:
Sauf que non, on me fait signe que c'est pas possible! Et pour une raison toute b�te: le code d'une classe template doit �tre dans l'en-t�te (ou inclure le cpp � la fin de l'en-t�te ce qui revient au m�me). Et donc �a casse mon pimpl.
Code : 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 /***** my_lib.h ********/ class MyLibImpl; template <typename T> class MyLib { public: // protocol void DoSomething(); // ... private: MyLibImpl * impl_; // pimpl: tout sera implémenté dans cette classe T a_super_important_value; };
Savez-vous quelles sont les solutions pour se sortir de cette situation � peu de frais?
Partager