SmartPointer
L’archive smart.tar.gz constient une la déclaration et la définition d’une classe SmartPointer
(à l’intérieur du namespace enseirb
).
Un objet SmartPointer
se comporte comme un pointeur (pour l’instant comme un pointeur sur un entier). Pour cela la classe redéfinit les opérateurs *
(unaire) et ->
qui utilisent le véritable pointeur data
stocké dans l’objet.
Plusieurs objets SmartPointer
peuvent pointer vers un même objet; ils partagent alors aussi un même compteur counter
qui stocke le nombre de SmartPointer
qui partagent le même data
.
Les différents composants de SmartPointer
impliqués dans la gestion de la mémoire dynamique mettent à jour le compteur, et si celui-ci devient nul, l’objet data
et le compteur sont libérés.
Faire un schéma qui représente l’état de la pile et du tas durant l’exécution du main
présenté dans SmartExemple.cpp
.
Rendre SmartPointer générique
Nous allons modifier la classe SmartPointer
pour en faire une classe génerique pouvant encapsuler des data
de n’importe quel type. Veillez à bien respecter les étapes successives et tester la compilation après chaque étape.
- Placer les définitions des méthodes dans le fichier SmartPointer.hpp; dans la suite, on n’utilisera plus de fichier SmartPointer.cpp.
On définira les constructeurs et méthodes dont le bloc d’instructions est vide ou réduit à une instruction au moment de leur déclaration; on définira les autres (releasePointer
etoperator=
) en dessous de la classe.
Mettre à jour le Makefile. -
Ajouter la spécification de classe template:
template<class DataType> class SmartPointer { ... };
Attention,
-
pour définir un composant en dehors de la classe, il faut maintenant écrire par exemple
template<class DataType> void SmartPointer<DataType>::foo() {...}; template<class DataType> SmartPointer<DataType>* SmartPointer<DataType>::bar() {...};
-
le type d’un
SmartPointer
surint
est maintenantSmartPointer<int>
.
-
- Fixer le type de
data
àDataType*
dans la classeSmartPointer
. Modifier en conséquence les types des constructeurs et méthodes qui manipulentdata
- Vérifier que tout fonctionne en utilisant des
SmartPointer
sur d’autres types, par exemple
SmartPointer<Book> p(new Book("Hamlet", "Sk"));
SmartPointer<Book> q=p;
std::cout << p->getInfo() << std::endl;