clone d'objets (urgent) [C++] - Programmation
Marsh Posté le 06-06-2001 à 00:44:01
duplicateobject(), puis, pour se détendre, makecoffee()
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)
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).
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
Marsh Posté le 06-06-2001 à 14:17:06
C'est quoi un constructeur de copie ???
Et comment j'utilise l'operateur = ?
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 ?
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..
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 ?
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 , 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!!
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()
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!!
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;
}
};
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..
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 :
|
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]
Marsh Posté le 07-06-2001 à 01:20:10
Ca devait être la seule chose du topic que je n'avais pas lu.
Sorry.
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 ???