simo035
Messages postés3Date d'inscriptiondimanche 7 mars 2010StatutMembreDernière intervention17 mai 2010
-
15 mai 2010 à 18:12
simo035
Messages postés3Date d'inscriptiondimanche 7 mars 2010StatutMembreDernière intervention17 mai 2010
-
17 mai 2010 à 07:08
Bonsoir tous le monde ! Problème de débutant, merci pour vôtre aide.
J’ai une classe Liste avec deux classe imbriquées Element et Place.
Disons par exemple que je veux crér deux listes depuis le main : la liste a et la liste b.
Ensuite, je crée pour chaque liste un élément, c’est-à-dire j'insert une valeur dans le champ info de la classe Element (par exemple la valeur 5 dans l'élément de la liste a et 3 dans celui de la liste b).
Donc en résumé j'ai deux listes avec chacune un seul élément dont la valeur contenu dans chacun vaut 5 pour liste a et 3 pour b. Ma question :
« depuis le main comment avoir accès directement à l'info contenue dans l'élément de a,
si je veut par exemple effectuer un cout de cette l'info (c-à-d 5) ? »
j'ai esseyé
cout ≪ a.info
mais évidement ça ne marche pas car info est un champ de la classe Element
merci
ma classe:
class Liste
{
class Elem
{
public:
Elem(int,int, Elem *);
int info;
int info2;
Elem *suiv;
Elem *debut;
};
public:
class Place
{
public:
friend class Liste;
Place suivant() const;
int info() const;
int info2() const;
bool valide() const;
Place();
private:
Place(Elem *);
Elem *elem;
};
Place tete() const;
int longueur() const;
void imprimer() const;
bool vide() const;
Place insererEnTete(int, int);
Place insererApres(Place, int, int);
void supprimer(Place);
Place trouver(int) const;
Liste& operator=(const Liste &);
Liste& operator<<(const Liste &);
Liste();
Liste(const Liste &);
~Liste();
manudiclemente
Messages postés14Date d'inscriptionvendredi 14 mai 2010StatutMembreDernière intervention 9 mars 2011 16 mai 2010 à 23:49
Si un attribut est privé (ce qui doit être le cas selon le principe fondamental d'encapsulation), seule l'objet a le droit d'y accéder dans ses méthodes (ou fonctions si tu préfères). La solution est de faire des méthodes appelées accesseurs pour récupérer les valeurs. Elles on cette forme, par exemple :
private:
int age;
public:
int getAge() const {return this->age;}
Pour afficher la variable, on aura
cout << a.getPlace.getInfo();
Quant à la gestion de la liste, il faut maitriser des principes de gestionnaire de mémoire (réserver de la mémoire en bloc, la libérer) que je ne maitrise pas trop... A voir!
manudiclemente
Messages postés14Date d'inscriptionvendredi 14 mai 2010StatutMembreDernière intervention 9 mars 2011 15 mai 2010 à 19:22
DéjPà, pour la lisibilité, essaie de faire des classes distinctes :
class Elem{
...
};
class Place{
...
};
class Liste{
private:
Elem e;
Place p;
};
Parce que les classe imbriquées, c'est pas facile à gérer, ni réutilisable.
Ensuite, si ce que tu veux est dans une classe Élément, il faut passer par la classe Liste :
si on a info dans "Element elem" lui meme dans "Liste a", il faut faire cout << a.elem.info
Pour info, la STL propose la classe vector qui est une liste très simple et très bien faite.
simo035
Messages postés3Date d'inscriptiondimanche 7 mars 2010StatutMembreDernière intervention17 mai 2010 15 mai 2010 à 19:46
Merci pour la réponse !
Je suis d'accord pour les classes imbriquées, vaudrait mieux séparé (je parle en tant que débutant, ce serait plus facile à géré), le fait est qu'il s'agit d'une contrainte imposé par l'énoncé d'un projet à l'unif… donc je n'est pas le choix..
cout << a.elem. info
ne marche pas, car elem est en privé, je ne peux y accéder
ni
cout << a.Place.info(); avec info () qui renvoi info de elem (ne compile pas)...
vector je connais, c'est hyper pratique, mais le but du projet est d'implémenter des multi-ensembles sous forme de listes ; donc évidement on nous en interdit l'usage.
merci encore
Salut
simo035
Messages postés3Date d'inscriptiondimanche 7 mars 2010StatutMembreDernière intervention17 mai 2010 17 mai 2010 à 07:08
Merci Manu pour tes réponses! j'ai compris et résolu le problème.
En fait je cherchais à surcharger un opérateur de comparaison == et maintenant c'est bon!
il me fallait d'abord déclarer 2 objets Place de cette façon:
Place a=this->tete();
Place b=p.tete();
et puis utiliser a et b pour acceder au champ info de elem:
a.info() et b.info()