Interdire les recopies de classes.

Une sécurité pour vous assurer que jamais votre classe ne sera recopiée.

private

Voir version :

Pas de dépendances

Télécharger :

#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;
}




Commentaires


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