cs_thomas71
Messages postés13Date d'inscriptionmercredi 29 juin 2005StatutMembreDernière intervention 4 juillet 2012
-
4 juil. 2012 à 20:54
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 2016
-
5 juil. 2012 à 13:21
Bonjour,
j'ai écrit ce code afin de m'entraîner à utiliser les classes. Cependant, il produit un résultat inattendu et je n'arrive pas à trouver l'origine du problème. Le code est le suivant :
#include
#include <cmath>
using namespace std;
class point
{
public:
point(int abscisse, int ordonnee)
{
x = abscisse;
y = ordonnee;
};
int abscisse() {return x; }
int ordonnee() {return y; }
private:
int x;
int y;
};
class segment
{
public:
segment(point a, point b)
{
debut = &a;
fin = &b;
};
double l1()
{
return debut->abscisse();
}
double l2()
{
return debut->ordonnee();
}
double l3()
{
return fin->abscisse();
}
double l4()
{
return fin->ordonnee();
}
private:
point * debut;
point * fin;
};
int main()
{
point a(1,2), b(3,4);
segment ab(a,b);
cout << "Abscisse de a : " << a.abscisse() << ", ordonnee de a : " << a.ordonnee() << endl;
cout << "Abscisse de b : " << b.abscisse() << ", ordonnee de b : " << b.ordonnee() << endl;
cout << "Longueur de [ab] : " << ab.l1() << " " << ab.l2() << " " << ab.l3() << " " << ab.l4();
return 0;
}
J'obtiens ceci en sortie :
Abscisse de a : 1, ordonnee de a : 2
Abscisse de b : 3, ordonnee de b : 4
Longueur de [ab] : 4.61813e+006 2 3 4
Normalement, il devrait retourner : Longueur de [ab] : 1 2 3 4
yann_lo_san t'as déjà décrit l'origine du problème, je n'y reviendrais donc pas. Il est, de manière générale, dangereux de prendre l'adresse d'une valeur temporaire.
je me demande pourquoi ce problème se produit pour a.abscisse() et pas pour b.abscisse()..
Coup de chance, ça dépend de l'état de la mémoire à un instant t. Une valeur détruite ne l'est pas pour de vrai, elle est marquée comme étant réinscriptible. Si par chance aucun processus n'a réécrit par dessus, tu auras la bonne valeur (mais aucune garantie forte).
@yann_lo_san: Pas tout à fait d'accord avec deux choses (vraiment des petits détails, ton explication étant tout à fait correcte):
segment(const point& a, const point& b)
{
debut = new Point(a.abscisse(), a.ordonnee());
fin = new Point(b.abscisse(), b.ordonnee());
};
Dans ce cas, autant laisser "point a" en arguemnt et mettre comme attributs des "point" au lieu de "point*". La gestion est alors automatique pour un résultat similaire à ce que tu proposes.
Les "if" ne servent à rien ici. "delete 0" est tout à fait valide et ne fait rien. delete est une fonction qui vérifie déjà si le pointeur est nul.
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 4 juil. 2012 à 21:43
Salut,
tu passes des "point" valeurs qui sont détruits à l'accolade fermante du constructeur,
tu devrais essayer ceci :
segment(point* a, point* b)
{
debut = a;
fin = b;
};
et
point a(1,2), b(3,4);
segment ab(&a, &b);
Mais il serait plus propre d'utiliser des références :
segment(const point& a, const point& b)
{
debut = new Point(a.abscisse(), a.ordonnee());
fin = new Point(b.abscisse(), b.ordonnee());
};
// et utiliser un destructeur
~segment()
{
if(debut) delete debut;
if(fin) delete fin;
}
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 5 juil. 2012 à 13:21
Salut,
tout à fait d'accord avec toi CptPingu.
2 questions simples à se poser pour l'agrégation :
- Vais-je modifier l'état de l'objet dans ma classe ?
- Dois-je copier l'objet pour que les changements d'état n'affectent pas l'objet original "venu de l'extérieur".
D'ou le choix entre pointeur, référence constante et référence non constante, et la prise de décision quant à la copie d'un objet.
Attention au "gros objets" copiés sur la pile.
hummm... gros objets, pile..., intéressant comme concept.