Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2756 connectés 

 


Dernière réponse
Sujet : [C++] clone d'objets (urgent)
BifaceMcLeOD :o Ca devait être la seule chose du topic que je n'avais pas lu.  :sarcastic:  
 
Sorry. ;)

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
BifaceMcLeOD :o Ca devait être la seule chose du topic que je n'avais pas lu.  :sarcastic:  
 
Sorry. ;)
janoscoder BifaceMcLeOD->relis mon code
BifaceMcLeOD 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]

oliv5 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..
janoscoder 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;
  }
};
H4dd3R 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!! ;)
tgrx oliv5> c'est ce que je voulais dire par copie octet par octet... faire un bete memcpy()
oliv5 je vais tester, mais ca me tente moyen :)
H4dd3R 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!! ;)
oliv5 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 ?
H4dd3R 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..  :)
oliv5 je peux pas faire objet1 = objet2, ca travaille sur les pointeurs.
Par contre, si je fais *objet1 = *objet2, ca fait quoi ?
oliv5 C'est quoi un constructeur de copie ???
Et comment j'utilise l'operateur = ?
verdoux Le constructeur de copie est même plus indiqué.
BENB 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
tgrx 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).
youdontcare 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)
oliv5 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 ???

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)