Problème avec la copie de variables

Problème avec la copie de variables - C++ - Programmation

Marsh Posté le 02-07-2004 à 09:48:22    

Bonjour à tous,
 
Je continue mon apprentissage du C++, et je suis confrontée à un petit problème. Voici mon code de test :
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. class test
  4. {
  5.    public:
  6.    int *a;
  7.    test();
  8.    ~test();
  9. };
  10. test::test()
  11. {
  12.    a = new int;
  13.    *a = 4;
  14. }
  15. test::~test()
  16. {
  17.    delete a;
  18. }
  19. int main()
  20. {
  21.    test t1;
  22.    test t2 = t1;
  23.    *(t1.a) = 4;
  24.    *(t2.a) = 5;
  25.    cout << *(t1.a) << endl;
  26.    cout << *(t2.a) << endl;
  27.    cin.ignore();
  28. }


J'obtiens la sortie suivante :

Citation :


5
5


Et je ne comprends pas pourquoi. On dirait que la modification de la variable "a" de t2 a modifié la variable "a" de t1.
Je ne comprends pas pourquoi.
 
Merci d'avance pour votre aide

Reply

Marsh Posté le 02-07-2004 à 09:48:22   

Reply

Marsh Posté le 02-07-2004 à 09:50:50    

en initialisant t2 à partir de t1, tu en copies tous les membres, notamment le pointeur *a qui sera donc le même sur les 2 objets. en l'occurence, toute modification de l'objet pointé par a sur t1 sera répercuté sur t2 puisqu'ils ont la même adresse.
 
=> il te faut un constructeur de copie pour ta classe test


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-07-2004 à 09:56:40    

Je ne connais pas du tout cette notion de constructeur de copie. A quoi sert il, et comment l'utiliser pour résoudre mon problème ?

Reply

Marsh Posté le 02-07-2004 à 10:00:28    

euh, tu suis des cours ou pas ? [:heink]
un constructeur de copie est utilisé justement dans ton cas précis (entre autres) : lorsqu'une classe contient une variable membre de type objet dynamique (un pointeur quoi)
dans ton cas précis, ton constructeur de copie devra réaliser une nouvelle initialisation de ton pointeur a, pour éviter qu'il n'ait la même adresse que l'objet que tu copies.
 
dans la déclaration de ta classe, rajoute la ligne suivante :

Code :
  1. test(test& );


ce constructeur sera implémenté comme ceci :

Code :
  1. test::test(test& t)
  2. {
  3.    a = new int;
  4. }


et O miracle, tu devrais obtenir les valeurs souhaitées (4 et 5)


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-07-2004 à 10:34:14    

Ca fonctionne parfaitement, merci pour ton aide. :jap:
Je vais me pencher plus profondément sur cette notion qui m'était totalement inconnue.

Reply

Marsh Posté le 02-07-2004 à 11:02:32    

harko t'es un boolay
 
vous êtes tous des boolay
 
 
Celina > dans ce genre de cas, c'est à dire avec des pointeurs, ce que génère le compilateur à ta place n'est pas satisfaisant car ça ne fait qu'une copie de surface. il faut faire une copie profonde, c'est à dire allocation+recopie
 
la forme de Coplien, tu dois définir minimum
 
A()
A(const A & );
A & operator=(const A & );
~A();
 
donc Harko s'est royalement planté dans la signature, et surtout il a oublié l'operator=. tu suis tes cours ? :D

Reply

Marsh Posté le 02-07-2004 à 11:14:53    

Taz a écrit :

harko t'es un boolay
 
vous êtes tous des boolay


rooo, mais j'ai pas dit tant de conneries que ça bon dieu :o
j'ai juste oublié un const et l'operator=, y'a des boolays qui ont fait pire hein :o


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed