Dans un message du 29 Apr � 22:41, Pierre THIERRY �crivait :
> > Tu dois retourner une *r�f�rence* sur ton Dice pas un nouvel objet. En
> > effet, tu vas cr�er des objets temporaires (un par appel a <<) qui
> > r�f�rencent le m�me vecteur.
> 
> Non, car ayant surd�fini l'op�rateur =, il n'y a pas de copie
> superficielle.

Nan ca n'est rien a voir.  Quand tu retournes un objet par valeur, le
constructeur par recopie est appele (sauf si ton compilateur peut
utiliser la "return value optimization, mais ce n'est pas le cas ici) et
pas l'operateur d'assignement qui n'est appele que pour les objets
*deja* construits.

exemple:
A a;
A aa = a; // appelle le cteur par recopie et pas operator=
A aaa(a); // pareil
aa = a;   // appelle operator= car aa deja construit

> N�anmoins, merci de la remarque, c'est corrig�. Le probl�me venait
> probablement du fait que mon constructeur de recopie ne cr�ait pas le
> vecteur, en fait. C'est corrig�, et cette partie du code fonctionne
> d�sormais, semble-t-il.

Ca ne changera pas le schmilblick.  Ta chaine d'appel de l'operator <<
ne fonctionnera pas comme prevu si tu ne renvoies pas une *reference*.
Sinon tu vas creer des objets temporaires a la chaine et ton objet de
depart ne sera appele que la premiere fois.

Pourquoi crois-tu que tous les operateurs <<,  >> et = standards
renvoient des references?

De plus, tu dois aussi dupliquer les objets pointes sinon quand tu fais
une copie d'un Dice, sinon la destruction d'un des objets va invalider
l'autre (sauf si tu laisses la memoire fuir).

> Par contre, je suis tomb� sur troisi�me bug dans mon code, et je suis
> effar� que le compilo soit pass� outre�:
> 
> template<class T> Dice & operator =(const T &)
> {
>       m_rollable_scalars->clear();
>       this->append(value);
>       return *this;
> }
> 
> value aurait du �tre l'identifiant de l'argument, mais j'avais oubli�,
> une fois que j'ai d�cid� d'en faire une fonction template d�finie dans
> le fichier d'en-t�te, de le rajouter dans ce qui �tait le prototype.
> 
> C'est un bug dans GCC, ou c'est parce que c'�tait une fonction
> template�?

C'est parce que le compilateur n'est pas oblige d'instancier ton
template lors de sa declaration (et en pratique peu de compilateurs le
font).  Ton code ne l'instanciant jamais le compilateur ne t'a pas donne
d'erreur. (C'est au passage la preuve que ce que je te disais dans mon
precedent message est vrai).

Au passage, ton operateur= ne fonctionne pas correctement pour
l'aliasing. (Si je me souviens bien, c'est le cas de tous tes operateurs
d'assignement).

Ta methode elements() retourne une copie du vecteur de pointeurs donc
n'importe quel client de ta classe peut appeler delete sur les pointeurs
et donc faire planter le programme.

-- 
Guillaume Morin <[EMAIL PROTECTED]>

        Justice is lost, Justice is raped, Justice is done. (Metallica)


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Répondre à