// Code pour recopier effectivement l'objet object dans *this.
}
return *this;
}
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 ???