next up previous contents index
suivant: Libération et glanage d'objets monter: main précédent: Files et parcours en   Table des matières   Index


Clonage d'objets

C++ permet aussi bien l'initialisation que l'affectation des structures : c'est une copie de l'objet qui est réalisée. Cela est utile quand les objets d'une structure de données sont exactement représentés par des valeurs d'un type struct : nombres complexes, etc. Dans d'autres cas, par exemple pour des arbres binaires, la copie d'une structure tree_cell n'entraine pas une copie de l'arbre complet, mais seulement de la cellule représentant la racine :


    tree c = tree_cons(0, 
                      tree_cons(1,NULL,NULL),
                      tree_cons(2,NULL,NULL));
    tree c1 = c;
    tree_cell s = *c;


\begin{figurette}
% latex2html id marker 4868\begin{center}
\leavevmode
\fb...
...aption {Partage de sous-objets par copie partielle} \end{center} \end{figurette}

Alors que c1 et c désignent le même objet, la définition de s crée une nouvelle structure, mais les objets au deuxième niveau de l'arbre sont identiques : il y a partage de sous-objets (figure 25). Une modification d'un sous-objet de s revient donc à une modification de c et de c1, ce qui n'est pas toujours souhaité.

Il faut donc programmer explicitement une fonction, dite de clonage, qui parcours l'arbre et qui effectue des copies de toutes les structures, et pas seulement de celle qui figure à sa racine. Un parcours en profondeur donne la fonction suivante :


tree tree_clone(tree p) {
  tree t = NULL;

  if (!is_empty_tree(p)) {
    t = tree_cons(p->label, 
           tree_clone(p->left), 
           tree_clone(p->right));
    }
  return t;
}


\begin{figurette}
% latex2html id marker 4876\begin{center}
\leavevmode
\fb...
...ig/cell_clone.eps}
} \caption {Clonage d'un arbre} \end{center} \end{figurette}

Elle pourra servir aussi bien dans la définition d'un arbre (figure 26) que comme membre droit d'une affectation :


    tree c = tree_cons(0, 
                      tree_cons(1,NULL,NULL),
                      tree_cons(2,NULL,NULL));
    tree c3, c2 = tree_clone(c);
    ...
    c3 =  tree_clone(c2);


next up previous contents index
suivant: Libération et glanage d'objets monter: main précédent: Files et parcours en   Table des matières   Index
R Lalement