/** * auteurs : Michel Landschoot * mail : direction@landsnet.com * date de création : 2013-12-21 * description : impléméntation d'une hiérarchie de figures géométrique et filtrage * selon certaines conditions. * * Cette VERSION2 diffère de la VERSION1 quant au conteneur de figures de la classe Image * Le tableau de pointeurs de la version1 est remplacé par une liste de la STL. * * Seul le code de la classe Image nécessite une modification. * On a respecté l'invariance du code utilisateur de la classe Image par rapport à sa RPI * (Représentation interne des données : l'implémentation en fait). * * L'implémentation proposée repose sur la recopie dynamique d'instances aussi bien * allouées staitiquement que dynamiquement * Le partage d'instances n'est pas possible. * * Une fonction virtuelle de copy de recopie dynamique est proposée dans chaque classe * de la hiérarchie. Elle simule les constructeurs virtuels : le C++ ne les autorise pas. * * Cette fonction de copie virtuelle est appelée dans les constructeurs de copie et dans * la fonction ajouter de la classe Image. * Le constructeur de copie de la classe Image doit réaliser une copie profonde : Image::Image(const Image & image) : _origine(image._origine), _nombre(image._nombre) { list
::const_iterator it(image._figures.begin()); list
::const_iterator end(image._figures.end()); while(it != end) { _figures.push_back((*it)->copy()); ++it; } } * Les instances sont recopiées lorsqu'elles sont ajoutées dans la liste de figures. * Dans la méthode ajouter on a : _figures.push_back((const_cast
(&f))->copy()); _nombre++; * * * Dès lors, le destructeur de la classe Image doit appeler les destructeurs des figures * de la liste virtual ~Image() { list
::iterator it(_figures.begin()); list
::const_iterator end(_figures.end()); while(it != end) { it = _figures.erase(it); ++it; } } * Une autre implémentation consisterait à partager des instances allouées dynamiquement * Le recours à des COMPTEURS DE REFERENCE serait alors indispensable. */