{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
Utilisateur anonyme - 12 avril 2013 à 15:34
A voir également:
- {void in(objet_dérivé); objet_dérivé = (objet_base) out();} Err?
- Dc in - Forum Audio
- Cvbs in 1 - Forum Autoradio
- In da place - Forum Mail
- Hdmi out - Forum Format et connectique vidéo
- Navigation in private - Guide
3 réponses
Utilisateur anonyme
12 avril 2013 à 07:56
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 :
Je n'ai fait que regarder très brièvement, mais as tu essayé un simple cast?
soit faire :
return (Client*)_queue.removeFirst();
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
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.
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.
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
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.
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.
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
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
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.
à 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.
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
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
Utilisateur anonyme
12 avril 2013 à 12:56
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();"
Il suffi de faire un "cast" en ajoutant (Client*) :
"return _queue.removeFirst();" => "return (Client*)_queue.removeFirst();"
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
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 ?
C'est quoi ton école qu'on ne la recommande pas ?