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);
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
On Fri, 12 Aug 2005 12:57:06 +0200, Bruno CAUSSE <envoi@lesSpam.fr>:
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.
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.
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,
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:....
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.
Fabien LE LEZ wrote:
On Fri, 12 Aug 2005 12:57:06 +0200, Bruno CAUSSE <envoi@lesSpam.fr>:
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.
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.
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.
On Fri, 12 Aug 2005 13:57:26 +0200, Bruno CAUSSE <envoi@lesSpam.fr>:
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.
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.
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.
On Fri, 12 Aug 2005 14:03:46 +0200, Bruno CAUSSE <envoi@lesSpam.fr>:
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.
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.