Pas de dépendances
#include <iostream> #include <cstdlib> using namespace std; class Test { protected: int a; private: //Test(const Test& t){} //Test& operator=(const Test& t){return *this;} public: Test(){a=5;} ~Test(){} }; void fonc(Test t) // l3 { } int main() { Test t,u; Test v(t); // l1 t = u; // l2 fonc(t); return 0; }
Le but de ce tuto est d'interdire la recopie d'une classe. Disons que vous voulez vous assurer que votre classe Test ne soit pas recopiée : - si jamais il y a beaucoup de données dedans : perte de temps de recopie pour rien - Aucune raison de dupliquer la classe. - Peur de modifier une copie et non l'originale... - ... Vous décidez donc d'empecher la classe de se recopier : on va voir comment faire dans ce prog. Voila un programme qui ne fait rien, mais qu'on va essayer de compiler. Compilez le tel quel : ça marche. Combien de recopies ? --> 3 Vous recopiez t dans v via le constructeur par recopie (ligne l1) Vous recopiez u dans t vie l'opérateur = (ligne l2) Vous passez la classe en parametre par recopie (ligne l3) Voila, vous avez fait 3 recopies, et pourtant, elles ne sont pas aisées a voir au premier coup d'oeil. Alors soit vous faites attention, soit vous activez les lignes : //Test(const Test& t){} //Test& operator=(const Test& t){return *this;} qui sont en private dans la classe. en fait, j'ai donc défini le constructeur par recopie et l'opérateur = dans la classe en private : du coup, on ne peut pas recopier la classe de l'extérieur. (peut importe ce que je mets dedans : de toute façon, je ne passez pas dedans.) Si vous compilez maintenant : les 3 recopies sont détectées : le programme ne compile pas. Cela vous permet de détecter les recopies. --> Quand il n'y aura plus d'erreurs : c'est que vous ne faites plus de recopies. Note : pour la fonction fonc, c'est une erreur classique : des recopies non attendues, a cause de l'oubli d'un "&" -> passage par référence private VS protected: ********************* Mettre le constructeur par recopie et l'opérateur = en private ou en protected ? --> Et bien tout dépend si vous voulez que les classes filles de Test puissent se recopier ou non....