Test de C++ n° 4 : (19 mai 2001 – durée : 2h)

 © D. Mathieu    mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique
Créé le 06/03/2001 - Dernière mise à jour : 06/03/2001

Tout document autorisé

Sommaire

1 - Surcharge de l'opérateur <<
2 - Nouvelle surcharge de l'opérateur <<
3 - Surcharge de l'opérateur +=
4 - Nouvelle surcharge de l'opérateur +=
5 - Surcharge de l'opérateur =
6 - Méthode Cloner()



Remarques préliminaires :
  • les exercices suivants concernent des compléments ou des modifications de la classe CTree étudiée au TP 14. Ils sont tous indépendants les uns des autres. Il n'est évidemment pas nécessaire de recopier à chaque question la totalité de la classe, mais d'indiquer les modifications de la façon suivante :
     
    // fichier CTree.h
    template <class T> class CTree 
    {
        // ...
          <-- vos ajouts
      public :
        // ...
          <-- vos ajouts
    }; // class CTree

    et
     
    // fichier CTree.hxx
    // ...
          <-- vos ajouts

    Vous utiliserez exclusivement les macros des corrigés :
     
    #define TEMPL    template <class T>
    #define TEMPLINL TEMPL inline
    #define CTREE    nsSdD::CTree <T>

  • Ne pas traiter les exceptions, en supposant qu'il y aura toujours assez d'espace mémoire pour ajouter de nouveau éléments. Cette supposition n'est faite que parce que les traitements seraient beaucoup trop longs et difficiles dans le cadre d'un test.

  • 1 - Surcharge de l'opérateur <<

        Contrairement à ce que l'habitude pourrait laisser croire, on ne surcharge pas seulement l'opérateur << pour injecter des données dans un flux de sortie. Toute classe, en particulier toute classe de conteneur, peut proposer cet opérateur pour charger des données de provenances diverses, en particulier d'un autre conteneur. Dans cet exercice, il vous est demandé d'écrire l'opérateur membre << permettant d'ajouter à un arbre existant (l'arbre courant) des informations stockées dans un vector, de façon à permettre l'usage suivant :
     
    vector <string> VString1;

    VString1.push_back ("S4");
    VString1.push_back ("S2");
    VString1.push_back ("S6");

    CTree <string> Arbre;
    // Eventuellement remplissage de Arbre
    // ...
    Arbre << VString1; // Ajout des trois chaînes à Arbre
    Arbre.Editer();

        A la classe CTree générique, vous ajouterez préalablement un type privé CVectT qui représente un vecteur d'éléments du type T.

    Corrigé :     CTree.h    -    CTree.hxx

    Sommaire


    2 - Nouvelle surcharge de l'opérateur <<

        Si la surcharge que vous avez écrite dans l'exercice précédent ne permet pas l'écriture suivante :
     
    vector <string> VString1;
    vector <string> VString2;

    // remplissage de VSring1
    // ...
    // remplissage de VSring2
    // ...

    CTree <string> Arbre;
    Arbre << VString1 << VString2;
    Arbre.Editer();

    en proposer une nouvelle version qui la permette.

    Corrigé :      CTree.h     -    CTree.hxx

    Sommaire


    3 - Surcharge de l'opérateur +=

        Le C++ autorisant la surcharge des opérateurs, il faut en profiter chaque fois que l'utilisation d'un opérateur est au moins aussi lisible que l'appel d'une fonction.

        Surcharger l'opérateur += destiné à remplacer la fonction publique Ajouter() (cela signifie que vous ne devez pas utiliser cette dernière). Il doit permettre l'écriture suivante :
     
    CTree <string> Arbre;

    Arbre += "S4";
    Arbre += "S2";

    Arbre.Editer();

    Corrigé :      CTree.h     -    CTree.hxx

    Sommaire


    4 - Nouvelle surcharge de l'opérateur +=

        Si la surcharge que vous avez écrite dans l'exercice précédent ne permet pas l'écriture suivante :
     
    CTree <string> Arbre;

    Arbre += "S4";
    (Arbre += "S2").Editer();

    en proposer une nouvelle version qui la permette.

    Corrigé :      CTree.h     -    CTree.hxx

    Sommaire


    5 - Surcharge de l'opérateur =

        La solution proposée ici est simple : elle consiste à transférer dans l'arbre courant chacune des valeurs que contient l'arbre source passé en paramètre. Ce dernier doit donc être parcouru récursivement afin d'atteindre chacun de ses noeuds.

        Comme pour les différentes fonctions étudiées en TD/TP, il faut écrire deux fonctions :

    Corrigé :     CTree.h    -    CTree.hxx

    Sommaire


    6 - Méthode Cloner()

        La surcharge des opérateurs étant malheureusement impossible en Java, la méthode clone() existe  pour tout objet, et permet de le dupliquer. Dans cette question, il est demandé d'écrire en C++ une fonction membre publique Cloner(), de profil :
     
    CTree & Cloner (const CTree & Tree);

        Il serait possible de l'implémenter de façon analogue à l'affectation ci-dessus, mais nous préfèrerons utiliser une autre méthode pour deux raisons :

        La fonction publique Cloner() doit utiliser une fonction membre privée Cloner(), de profil :
     
    CNoeudT * Cloner (CNoeudT * const Ptr);

    qui :

    Corrigé :      CTree.h      -      CTree.hxx

    Sommaire

    © D. Mathieu    mathieu@romarin.univ-aix.fr
    I.U.T.d'Aix en Provence - Département Informatique