Classes imbriquées accès aux infos [Résolu]

Messages postés
3
Date d'inscription
dimanche 7 mars 2010
Statut
Membre
Dernière intervention
17 mai 2010
- - Dernière réponse : simo035
Messages postés
3
Date d'inscription
dimanche 7 mars 2010
Statut
Membre
Dernière intervention
17 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();

private:
void effacer();
void copier(Place);
Elem *tetePtr;
};
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
14
Date d'inscription
vendredi 14 mai 2010
Statut
Membre
Dernière intervention
9 mars 2011
3
Merci
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!

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 196 internautes nous ont dit merci ce mois-ci

Commenter la réponse de manudiclemente
Messages postés
14
Date d'inscription
vendredi 14 mai 2010
Statut
Membre
Dernière intervention
9 mars 2011
0
Merci
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.
Commenter la réponse de manudiclemente
Messages postés
3
Date d'inscription
dimanche 7 mars 2010
Statut
Membre
Dernière intervention
17 mai 2010
0
Merci
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
Commenter la réponse de simo035
Messages postés
3
Date d'inscription
dimanche 7 mars 2010
Statut
Membre
Dernière intervention
17 mai 2010
0
Merci
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()

Merci encore
Grazie mille!
Commenter la réponse de simo035