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.

  1. 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 et operator=) en dessous de la classe.
    Mettre à jour le Makefile.
  2. 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 sur int est maintenant SmartPointer<int>.

  3. Fixer le type de data à DataType* dans la classe SmartPointer. Modifier en conséquence les types des constructeurs et méthodes qui manipulent data
  4. 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;