[C++] clone d'objets (urgent)

clone d'objets (urgent) [C++] - Programmation

Marsh Posté le 06-06-2001 à 00:41:03    

On fait comment si on veut cloner un objet à l'identique ? Y a t-il un operateur du type new, ou je ne sais quoi, ou alors doit-on tout se taper soit même ???

Reply

Marsh Posté le 06-06-2001 à 00:41:03   

Reply

Marsh Posté le 06-06-2001 à 00:44:01    

duplicateobject(), puis, pour se détendre, makecoffee() :D
 
non, il faut dupliquer à la main. à toi de créer une nouvelle instance de l'objet, copier tous les membres (copymemory) ne marchera que si tu n'as pas d'objets complexes au sein de la classe (pointeurs à dupliquer à la pogne)

Reply

Marsh Posté le 06-06-2001 à 09:03:34    

Pareil que youdontcare...
 
Si ta classe ne comporte pas de pointeurs ni de references, en gros si chaque element de ta classe est independant du reste, l'operateur = fera une copie octet pour octet, et ca marchera nickel.
En revanche si tu as des pointeurs, l'operateur = standard te fera aussi une duplication de ces pointeurs, et donc les elements de ta nouvelle instance peuvent pointer vers des elements de l'ancienne... faire attention donc (tu as juste a surcharger l'operateur = pour qu'il fasse ce que tu veux).

Reply

Marsh Posté le 06-06-2001 à 12:24:59    

Operateur = ou constructeur de copie...
 
s'il n'y a pas de pointeurs ou de references dans ta construction tu peut utiliser ceux generes par le compilo

Reply

Marsh Posté le 06-06-2001 à 12:32:21    

Le constructeur de copie est même plus indiqué.

Reply

Marsh Posté le 06-06-2001 à 14:17:06    

C'est quoi un constructeur de copie ???
Et comment j'utilise l'operateur = ?

Reply

Marsh Posté le 06-06-2001 à 14:18:43    

je peux pas faire objet1 = objet2, ca travaille sur les pointeurs.
Par contre, si je fais *objet1 = *objet2, ca fait quoi ?

Reply

Marsh Posté le 06-06-2001 à 15:21:28    

Un copy constructor est un constructeur qui en profite pour faire une copie..
 
class Toto
{
public:
   int i;
 
   Toto();
   Toto(Toto& Source);  <- le copy constructor.
};
 
Toto::Toto(Toto& Source)
{   // Copier le int.
    i=Source.i;
}
 
Typiquement un object qui alloue de la mémoire (avec un pointeur dedans donc) devra verrouiller le copy constructor car l´allocation de mem peut foirer..  :)


---------------
Athlon64 s754 10*200MHz - R9800Pro - 512MB DDR200MHz - ZX6RR - Q2[SupOp] - Tutorial Video: multilangues, multisstitres
Reply

Marsh Posté le 06-06-2001 à 15:42:01    

j'ai fait un truc un peu dans ce gout la, mais en moins clair. Mais en ce qui concerne la copie d'objet octet par octet dont parle tgrx, ca marche comment ?

Reply

Marsh Posté le 06-06-2001 à 15:51:25    

Si tu es sûr de pouvoir copier bit à bit, mais vraiment si tu es sûr  :D  :D  :D , ya une méthode simple, rapide (donc bourrine)..
 
Toto::Toto(Toto& Source)
{  // J´adore être bourrin qd c sûr!!
   memcpy(this, &Source, sizeof(Toto));
}
 
Rigolez pas, c pas de la mauvaise programmation, c sûr!!
Mais il faut faire gaffe à n´avoir que des éléments qui l´acceptent ds la classe!! ;)

Reply

Marsh Posté le 06-06-2001 à 15:51:25   

Reply

Marsh Posté le 06-06-2001 à 16:02:48    

je vais tester, mais ca me tente moyen :)

Reply

Marsh Posté le 06-06-2001 à 16:07:53    

oliv5> c'est ce que je voulais dire par copie octet par octet... faire un bete memcpy()

Reply

Marsh Posté le 06-06-2001 à 16:12:20    

Non non oliv5 soit pas aigri c tt à fait correct!!
C d´ailleurs ce que fait l´opérateur = par défaut et le copy constructor par défaut..
 
Le pb des 3 c que si tu as des trucs plus complexes genre de la mémoire allouée et l´adresse stockée, il va copier bien gentiment l´adresse au lieu d´allouer de la nouvelle mémoire et de copier les contenus.. Et qd tu auras détruit le premier obj mémoire les pbs commenceront!! ;)

Reply

Marsh Posté le 06-06-2001 à 16:53:19    

showtime
Déjà, quand y'a pas de pointeur, genre on utilise la STL, on peut se fier à l'opérateur par recopie défini implicitement
->tgrx, non, il fait pas une copie octet par octet, mais appelle l'opérateur = des données membres et classes fille, et l'op = pour un pointeur, c'est ce que l'on sait.
Mais s'il faut écrire l'opérateur = soi même, voici la forme:
ex sur un truc du genre vecteur
 
class A
{
 int n;
 int * data;
public:
 A(int size):n(size), data(new int[size]){}  
 ~A(){delete[]data;}
 A & operator = (const A & other)
  {
   if (&other==this)
    return *this; //c'est mio-même
   delete [] data; //ou ~A();
   n=other.n;
   data= new int[n];
   for (int i=0; i<n; i++)
    data[i]=other.data[i];
   return *this;
  }
};

Reply

Marsh Posté le 06-06-2001 à 20:48:08    

Vu que je ne souhaite pas concerver les objets alloues, j'ai fait un simple constructeur de copie. Mais redefinir l'operateur = ca peut m'etre utile.Merci janoscoder..

Reply

Marsh Posté le 06-06-2001 à 22:05:42    

Attention !
 
Si tu redéfinis l'opérateur d'affectation, il est plus que conseillé de l'écrire comme suit:

Code :
  1. MyClass& MyClass::operator=(const MyClass& object) {
  2.     if (this != &object) {
  3.         // Code pour recopier effectivement l'objet object dans *this.
  4.     }
  5.     return *this;
  6. }


Parce que si la condition en rouge ci-dessus n'est pas vérifiée et qu'on fait quand même la recopie, on se retrouve très souvent avec un comportement vraiment bizarre, incorrect (évidemment) et bonne chance pour trouver que ça vient de là...

 

[edit]--Message édité par BifaceMcLeOD--[/edit]

Reply

Marsh Posté le 06-06-2001 à 23:15:19    

BifaceMcLeOD->relis mon code

Reply

Marsh Posté le 07-06-2001 à 01:20:10    

:o Ca devait être la seule chose du topic que je n'avais pas lu.  :sarcastic:  
 
Sorry. ;)

Reply

Sujets relatifs:

Leave a Replay

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