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....
