OVH Cloud OVH Cloud

[detutant] vector suite...

6 réponses
Avatar
Bruno CAUSSE
Je viens de lire le chapitre 10.4.4.1 du Stroustrup.

B(const B& src) {

premier = new A();
deuxieme = new A();

/* copie membre a membre (cas particulier) */
/* il faudrait redefinir = dans A */
*premier = *(src.premier);
*deuxieme = *(src.deuxieme);

}

B& operator=(const B& src) {

if(this != &src) { //compare les adresses

/* normalement il faudrait detruire les zones pointées par premier
et deuxieme et les créer de nouveau, la il s'agit d'une copie membre a
membre (cas particulier) */

/* copie membre a membre (cas particulier) */
/* il faudrait redefinir = dans A */
*premier = *(src.premier);
*deuxieme = *(src.deuxieme);

}

return *this;
}

M'a lecture a t'elle ete instructive?

Merci de votre patience.
--
bruno

6 réponses

Avatar
Fabien LE LEZ
On Fri, 12 Aug 2005 12:57:06 +0200, Bruno CAUSSE :

B(const B& src) {

premier = new A();
deuxieme = new A();
// [1]
/* copie membre a membre (cas particulier) */
/* il faudrait redefinir = dans A */
*premier = *(src.premier);
*deuxieme = *(src.deuxieme);


Si tu tiens vraiment à utiliser des pointeurs nus (ce qu'encore une
fois je te déconseille), la solution canonique serait :

B::B (B const& src)
: premier (NULL), deuxieme (NULL)
{
premier= new A (*(src.premier));
deuxieme= new A (*(src.deuxieme));
}

Le "deuxieme(NULL)" est là pour le cas où le constructeur de "premier"
lance une exception.

Avatar
Bruno CAUSSE
dans l'article , Fabien LE LEZ à
a écrit le 12/08/05 13:26 :

Si tu tiens vraiment à utiliser des pointeurs nus (ce qu'encore une
fois je te déconseille),


C'est noté, je testerai la copie simple, je n'ai qu'un mois de c++ (on
enleve les vacances), penses tu que je doive "attaquer" boost des
maintement?

la solution canonique serait :

B::B (B const& src)
: premier (NULL), deuxieme (NULL)
{
premier= new A (*(src.premier));
deuxieme= new A (*(src.deuxieme));
}
oui, je ne rajoute pas,


try{
.../...
} catch (std::bad_alloc& e_bd) {
delete A;
throw;
}

La question de mon 1er post tient tjrs

Si la creation d'un objet C echoue (capacité trop grande) que se passe t'il?
Comment en etre informé, les 1er objets B alloués sont t'ils detruits?

Avatar
Bruno CAUSSE
dans l'article BF225B46.7550%, Bruno CAUSSE à
a écrit le 12/08/05 13:57 :

dans l'article , Fabien LE LEZ à
a écrit le 12/08/05 13:26 :

Si tu tiens vraiment à utiliser des pointeurs nus (ce qu'encore une
fois je te déconseille),


C'est noté, je testerai la copie simple, je n'ai qu'un mois de c++ (on
enleve les vacances), penses tu que je doive "attaquer" boost des
maintement?

la solution canonique serait :

B::B (B const& src)
: premier (NULL), deuxieme (NULL)
{
premier= new A (*(src.premier));
deuxieme= new A (*(src.deuxieme));
}
oui, je ne rajoute pas,


try{
.../...

} catch (std::bad_alloc& e_bd) {
delete A;


delete premier;

Non, non pas sur la bosse (suplique)

throw;
}

La question de mon 1er post tient tjrs

Si la creation d'un objet C echoue (capacité trop grande) que se passe t'il?
Comment en etre informé, les 1er objets B alloués sont t'ils detruits?




PS: il est chiant entourage avec c'est RE :RE: RE:....


Avatar
Laurent Deniau
Fabien LE LEZ wrote:
On Fri, 12 Aug 2005 12:57:06 +0200, Bruno CAUSSE :


B(const B& src) {

premier = new A();
deuxieme = new A();
// [1]
/* copie membre a membre (cas particulier) */
/* il faudrait redefinir = dans A */
*premier = *(src.premier);
*deuxieme = *(src.deuxieme);



Si tu tiens vraiment à utiliser des pointeurs nus (ce qu'encore une
fois je te déconseille), la solution canonique serait :

B::B (B const& src)
: premier (NULL), deuxieme (NULL)
{
premier= new A (*(src.premier));
deuxieme= new A (*(src.deuxieme));
}

Le "deuxieme(NULL)" est là pour le cas où le constructeur de "premier"
lance une exception.


La liste d'initialisation est inutile tel quelle. Et de toute facon ce
type de code est bancal (fuite de memoire au minimum) si une exception
est levee apres la premiere *allocation*. Utiliser new dans un
constructeur n'est pas a la portee d'un debutant.

a+, ld.


Avatar
Fabien LE LEZ
On Fri, 12 Aug 2005 13:57:26 +0200, Bruno CAUSSE :

C'est noté, je testerai la copie simple, je n'ai qu'un mois de c++ (on
enleve les vacances), penses tu que je doive "attaquer" boost des
maintement?


Certainement bien avant de t'occuper de la gestion des pointeurs.

Les bases de la STL et de Boost, c'est relativement simple.

Ce dont tu parles (une classe qui contient un pointeur nu), c'est
nettement plus compliqué (ça occupe une bonne moitié de Exceptional
C++, qui n'est pas un bouquin pour débutants) et généralement moins
utile. Ça peut donc attendre.

Avatar
Fabien LE LEZ
On Fri, 12 Aug 2005 14:03:46 +0200, Bruno CAUSSE :

PS: il est chiant entourage avec c'est RE :RE: RE:....


Oui. C'est Microsoft -- ils détestent les standards.

Tu sais, il existe des vrais lecteurs de news.
Perso, je conseille Free Agent. En prime, il peut fonctionner à partir
d'une clé USB, si tu utilises un PC qui ne t'appartient pas.