{void in(objet_dérivé); objet_dérivé = (objet_base) out();} Err?

Fermé
Utilisateur anonyme - Modifié par Omoidashita le 12/04/2013 à 03:04
 Utilisateur anonyme - 12 avril 2013 à 15:34
Bonjour,

Je débute en C++, j'ai un devoir à faire et mon prof m'a demandé de réaliser une file d'attente à partir d'une classe Queue (une FIFO) et une classe Element donné.
Je dois donc créer une classe Client (sous classe de la classe élément) et une classe FileAttente qui doit contenir des clients à intégrer dans l'objet _queue de cette classe.

Classes données :

//Element.h  
class Element {  
 public:  
  virtual ostream& printOn(ostream& aStream) {  
    return aStream << "Element@" << (unsigned) this;  
  }  
};


//Queue.h  
class Queue {  
public:  
  Queue();  
  void addLast(Element* e);  
  Element * removeFirst();  
};



Classe à construire :

//Client.h  
class Client: public Element {  
 public:  
  Client();  
};


//FileAttente.h  
class FileAttente {  
 protected:  
  Queue _queue;  
 public:  
  FileAttente();  
  void ajouter(Client* c);  
  Client* retirer();  
};  


Cependant je me vois confronté à un problème, quand je faire sortir un client de mon objet _queue dans la fonction retirer() (de la classe FileAttente) le compilateur me renvoie l'erreur suivante qui cible la ligne "return _queue.removeFirst();" :

FileAttente.C::error: invalid conversion from 'Element*' to 'Client*' [-fpermissive]|


//FileAttente.C  

void FileAttente::ajouter(Client* c){  
    _queue.addLast(c);  
}  


Client* FileAttente::retirer(){  
    return _queue.removeFirst();  
}



Ma question est donc comment faire resortir mon Client de l'objet _queue bien comme un Client et pas simplement comme un Element ?

Merci.



PS: je n'ai pas le droit de modifier les classes Element et Queue.


A voir également:

3 réponses

Utilisateur anonyme
12 avril 2013 à 07:56
salut !
Je n'ai fait que regarder très brièvement, mais as tu essayé un simple cast?
soit faire :
 return (Client*)_queue.removeFirst(); 
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
12 avril 2013 à 08:54
Salut.
C'est tout à fait logique, tu ne peut pas faire l'héritage dans ce sens là : un client est un Element, mais un Element n'est pas un Client. Donc tu peux lui fournir un Element en lieu et place d'un Client, mais pas l'inverse.

Il n'y a pas de solution directe. Je ne vois vraiment pas l'intéret de ta classe Client qui n'apporte strictement rien.
Je ne vois pas comment "corriger", car pour moi ce que tu fait n'a pas de sens : stocker des Element dans queu, mais gérer en point d'entrée sortie des Client.
0
Utilisateur anonyme
12 avril 2013 à 09:22
je suis de ton avis sur le principe de l'héritage mais je pense que là l'idée est d'avoir des conteneurs génériques pour la file, et donc ca prendrai un sens ... et le cast devrai résoudre le soucis actuel
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
12 avril 2013 à 11:36
si tu veux des conteneur générique, fait des conteneurs générique : utilise template.

Le cast résoudra ton problème, mais c'est une très mauvaise solution. Si pour une raison tu ajoute des membre à Client, tu va avoir de sérieux ennuies de mémoire.
à ce moment là, il faut aue tu fasse un constructeur de Client prenant en argument un Element*, mais là bonjour les problèmes d'allocation mémoire et d'objets temporaire.
0
Utilisateur anonyme
12 avril 2013 à 11:43
tout dépend si c'est ton conteneur qui alloue la mémoire ou celui que créé les éléments, car si tu fais ton allocation puis que ton conteneur contient uniquement les adresses de départ, c'est toi qui gèrera ta mémoire (le pointeur se fout de connaitre de connaitre la taille d'un élément mais ne fera qu'indiquer son emplacement dans la mémoire ... enfin je pense que je t'apprends rien ^^),et vu que tu connais l'objet contenu ca ne pose pas de problèmes
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
12 avril 2013 à 12:15
Je ne te suis plus trop...
à ce moment là, à la place de Element, tu mets un void*. Tu avoueras tout de même que ton histoire est bien tordue. Faire un conteneur de "Element*" qui ne contient que des "Client*", il y a plus simple : soit un conteneur réellement générique (void* ou template) soit directement "Client*". J'espère ne jamais avoir à relire un de tes codes.
0
Utilisateur anonyme
12 avril 2013 à 12:36
c'est vrai que tu peux passer par un conteneur générique mais après on connais pas le but final, ca si tu travail au final uniquement sur ton conteneur et que les élements stocké possèdent des méthodes que tu souhaite appelé via ton contrôleur, tu pourras sans avoir à connaitre le type d'élément contenu, alors que par le void tu sera obligé de connaitre l'élément contenu pour appeler la méthode qui lui est propre ...

par exemple sur tu veux stocker des clientA et des clientB, et que dans tous les cas tu souhaite avoir une méthode de déconnexion, il sera plus simple d'avoir un client général avec une méthode de déconnexion vide qui sera surchargé par les client a&b, car tu n'aura pas à savoir quel type il est. (et ensuite tu peux avoir des traitements spécifiques par type de client).

et le fonctionnement de base (vis à vis de l'allocation) est en effet similaire au void*, le problème est que ton void* n'est qu'un type.

Pour ce qui est de mon code, j'espère aussi ne pas avoir à me relire =p
0
Utilisateur anonyme
12 avril 2013 à 12:56
Mon prof vient de me donner la solution.

Il suffi de faire un "cast" en ajoutant (Client*) :

"return _queue.removeFirst();" => "return (Client*)_queue.removeFirst();"
0
Utilisateur anonyme
12 avril 2013 à 13:03
je t'en prie ^^
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
12 avril 2013 à 13:58
mouai... apprendre à programmer en utilisant ce genre de rustine, c'est à mon avis une erreur.
C'est quoi ton école qu'on ne la recommande pas ?
0
Utilisateur anonyme
12 avril 2013 à 14:25
surement un endroit où on t'apprends pas windev ...
0
Utilisateur anonyme
12 avril 2013 à 15:34
pour info et plus d'informations : voir du côté du polymorphisme
0