pb de conception orientée objet - C++ - Programmation
Marsh Posté le 21-07-2005 à 15:45:32
ou sinon, tu peux faire des static_cast de tes PtBasic vers PtCal dans ton SetPtCal, auquel cas tu n'as plus besoin de tes méthodes virtuelles ...
( J'ai lu rapidement, vu que je suis au boulot, là, donc désolé si je réponds à côté )
Marsh Posté le 21-07-2005 à 16:12:18
je n'avais pas penser à ca ...
mais comme le vector <PtBasic*> est public il faut à chaque fois qu'un utilisateur de la classe SetPtCal utilise un
par exemple pt[i]->Nom() il pense à faire d'abord un static_cast pour convertir PtBasic* en PtCal* ce qui est quand meme con pour un point sortant d'un ensemble de PtCal....
Marsh Posté le 21-07-2005 à 16:14:33
bah, surcharge l'opérateur [] de ton SetPtCal pour qu'il fasse un accès à ton vecteur public et retourne le type casté
Marsh Posté le 21-07-2005 à 16:18:07
c'est une idée.... effectivement.. je devrais peut être mettre :
Private :
std::vector<PtBasic*> Pt;
et n'y acceder que par des fonctions ou surcharge d'operateur []
mais je me demande quand meme si je ne suis pas completement a cote de la plaque avec cette hierarchie de classe.... ca me semble un peu bancale mon affaire
Marsh Posté le 21-07-2005 à 16:20:13
theshockwave a écrit : bah, surcharge l'opérateur [] de ton SetPtCal pour qu'il fasse un accès à ton vecteur public et retourne le type casté |
Wow, ça a une chance de marcher ça ?
Marsh Posté le 21-07-2005 à 16:26:06
oui, enfin, ca ne retournera pas le type à proprement parler
Je me suis mal exprimé, ca fera juste le lien vers le vecteur avec un cast au passage, quoi. En gros :
Code :
|
Marsh Posté le 21-07-2005 à 16:26:45
Cependant, je me demande s'il ne serait pas mieux, pour ce genre de choses de préférer une agrégation à l'héritage ...
Marsh Posté le 21-07-2005 à 16:37:54
en fait c'est surtout la relation de SetPtBasic avec SetPtCal qui me pose probleme...
les PtCal contenu ds SetPtCal doivent par exemple pouvoir faire l'objet d'un calcul de plan moyen defini dans SetPtBasic( car il n'est pas besoin d'être PtCal pour avoir un plan moyen le niveau de definition PtBasic suffit pour ca)
par contre dans le SetPtCal il y a des fonctions plus avancées ou le nom des Points (uniquement ds PtCal) joue un role...
Marsh Posté le 21-07-2005 à 16:41:43
Il y a un problème de conception ici. En supposant que SetPtBasic et SetPtCal sont des conteneurs, tu voudrais un SetPtCal qui hérite de SetPtBasic mais qui ajoute :
- des fonctionalités ( pas de problème )
- des contraintes sur les objets manipulés ( problème car pas faisable en C++ facilement )
Je suggère de transformer ces deux conteneurs en template et de spécialisé la version SetPtCal pour ajouter les fonctionalités qui lui manquent par exemple ( si c'est possible, il me semble que oui )
Marsh Posté le 21-07-2005 à 16:45:07
je suis d'accord sur le fait qu'il y a un pb de conception... car je tourne en rond sur cette idée depuis un moment... et quoi que je fasse il y a tjs un pb...
par contre moi et les template ca fait 2 ..; je ne connait pas ce type de programmation... tu peux ma donner une piste ?
Marsh Posté le 21-07-2005 à 16:48:31
ddesbuis a écrit : je suis d'accord sur le fait qu'il y a un pb de conception... car je tourne en rond sur cette idée depuis un moment... et quoi que je fasse il y a tjs un pb... |
Pas trop non, mes templates C++ sont un peu rouillées par manque de pratique ces derniers temps
Marsh Posté le 21-07-2005 à 16:49:41
les templates, ca sert à faire de la généricité, et si tu as deux comportement différents à traiter, utiliser des templates ne sera peut-être pas une bonne idée, non ?
je proposais de l'agrégation pour le problème des sets, justement.
Je verrais bien une interface commune aux deux sets à la limite, et SetPtCal qui "contient" (ou agrège, donc) un SetPtBasic et a donc tout contrôle dessus. Il servirait donc d'interface évoluée vers le set plus générique.
Marsh Posté le 21-07-2005 à 16:51:55
theshockwave a écrit : les templates, ca sert à faire de la généricité, et si tu as deux comportement différents à traiter, utiliser des templates ne sera peut-être pas une bonne idée, non ? |
Les template ça sert à faire plein de choses et cela me semble très adapté dans ce cas car cela evite d'avoir un conteneur sous typé avec cast horrible partout.
Marsh Posté le 21-07-2005 à 16:54:28
moi j'ai rien contre mais dans ma bible C++ c'est pas expliqué l'agregation ??
pourrais tu brievement decrire les relations que tu mettrais en place en les classe PtBasic PtCAl SetPtBasic et SetPtCal ?
à mon avis PtBasic comme classe de base pour PtCal ca c'est bon
par contre je suppose que tu changerais la relation SetPtBasic et SetPtCal
voir meme que tu creerai une autre classe intermediaire ou sous jacente non ?
Marsh Posté le 21-07-2005 à 16:55:13
oui, j'ai été un peu réducteur, mais bon ... Pour ma part, je serais resté sur un système avec une interface dans laquelle je n'ai pas de spécialisation du vecteur et deux implémentations de l'interface : une pour le SetPtBasic et l'autre pour le SetPtCal, chacun intégrant son vecteur qui va bien et implémentant la bonne interface
Marsh Posté le 21-07-2005 à 17:01:38
la je suis d'accord pour moi c'est l'idee de base mais ca ne marche pas !!! en tout cas de la maniere dont je le fait
quand dans SetPtCal en ayant un :
Code :
|
provenant de SetPtBasic
je veux acceder à
Pt[i]->Nom() il me jette a la rue...
d'ou ton idee des static cast et autre surcharge[]....
c'est peut etre la solution remarque ... en y reflechissant c'est pas si bancale que ca ....
Marsh Posté le 21-07-2005 à 17:05:13
justement, non, ce n'est pas ce que tu fais ...
il te faudrait quelque chose de ce type :
Code :
|
Marsh Posté le 21-07-2005 à 17:08:08
Si tu tiens à faire des templates, tu peux aussi faire ca :
Code :
|
Le désavantage que tu pourras y voir, c'est que tu ne pourras plus utiliser ton SetPtCal comme s'il s'agissait d'un SetPtBasic ...
Edit : en fait, le problème se poserait aussi avec la méthode au-dessus à cause de la virtualité des méthodes définies dans l'interface commune
Marsh Posté le 21-07-2005 à 17:10:00
theshockwave a écrit : justement, non, ce n'est pas ce que tu fais ...
|
Chose qui n'a aucun interet sauf si tu veux faire du polymorphisme avec les conteneurs SetPt... Si ce n'est pas le cas, pas la peine de s'emcombrer avec ISetPt.
En fait, il y a un peu de généricité ici : les deux std::vector ne sont pas compatible entre eux par heritage mais ils le sont pas généricité.
Marsh Posté le 21-07-2005 à 17:10:06
oui mais par exemple la fonction
Plan PlanMoyen (std::ostream& out) const;
elle à exactement la meme implementatation avec des PtCal ou avec des PtBasic ....
dans ce cas je devrais l'implementer deux fois de la meme maniere
il devrait etre possible de ne l'implementer qu'une fois ...
Marsh Posté le 21-07-2005 à 17:12:16
je parlai de la methode de theShOcKwAvE dans mon message precedant
Marsh Posté le 21-07-2005 à 17:13:35
ben, il suffit, dans l'interface que j'ai mentionnée plus haut, de mettre un système pour accéder aux éléments de ton vecteur dans le type PtBasic, et c'est ok, non ?
Marsh Posté le 21-07-2005 à 17:14:53
oui la methode avec les template me semble etre la bonne car me permettant de definir une seule fois mes fonctions PlanMoyen etc ....
bon maintenant il faut que je lise sur les template car je n'ai jamais utiliser ca avant ... umffff
Marsh Posté le 21-07-2005 à 17:19:26
ben ... à moins que tu définisses ta fonction PlanMoyen comme template elle-aussi, ca ne collera pas, non
Marsh Posté le 21-07-2005 à 17:28:04
Code :
|
imaginons que dans SetPt je fasse :
Code :
|
et que dans cette fonction PlanMoyen j'ai :
Code :
|
ca ne marchera pas ? je veux dire je ne serais pas capable d'acceder au fonction de PtBasic à partir de la classe Template PT ?
Marsh Posté le 21-07-2005 à 17:34:29
ah, si, désolé, je n'avais pas réalisé que PlanMoyen était une méthode de ton set ... donc ce cas, oui, ca passe ... Par contre, documente-toi un peu plus sur les templates parce que tu vas aavoir un peu de mal sans ca
Marsh Posté le 21-07-2005 à 17:57:28
j'imagine que je vais me faire quelques suées grave :-)
bon ben d'ici quelque jour je mettrai le code qui marche en ligne .... yop yop
Marsh Posté le 21-07-2005 à 18:00:42
Avant que tu ne t'arraches les cheveux : mets les définitions des méthodes templates dans le même fichier que leur déclaration, tu chercheras à comprendre ca plus tard
Marsh Posté le 21-07-2005 à 18:04:13
tiens donc ... bon si tu le dis .... humf je renifle deja les plans zarb....
Marsh Posté le 21-07-2005 à 19:03:36
theshockwave a écrit : Avant que tu ne t'arraches les cheveux : mets les définitions des méthodes templates dans le même fichier que leur déclaration, tu chercheras à comprendre ca plus tard |
C'est clair la première fois ça fait bizzard!
Marsh Posté le 22-07-2005 à 16:06:02
Code :
|
*
voila finalement ce qui est sortit de mon esprit enfumé...
le vecteur et privé et on accede au element par interface at_pb() et at_pc()
dans et_pc() il y a un dynamique_cast
et dans la fonction virtuelle push_back SetPtCal verifie par dynamic_cast que les objets pusher sont bien des PtCal*
a priori ca marche...
YOP
Marsh Posté le 22-07-2005 à 16:20:06
c'est cool ton truc, mais c'est un peu une usinage à gaz ?
j'ai pas cherché à comprendre ton intention, mais par exemple si c'est un vecteur de vertex (point x,y,z et autres affinitées) que tu stoques, mois je ferais une class Vertex basique sans rien de virtuel...
Et après tu fais un VirtVertex ou j'en sais rien avec tes interfaces en virtual....
tu mets ça en vector<> pour avoir un truc simple, et une hash_map<string,int> pour résoudre l'indice d'un vertex par son nom, voir un vector<string> en parallèle pour éviter de polluer le cache....
enfin ce que j'en dis, je sors ->[]
Marsh Posté le 21-07-2005 à 14:16:40
voila mes classes :
j'ai donc un objet PtBasic qui ne contient que x,y,z la base
un objet PtCal qui possede en plus un nom et des ecarts types en x y et z -> ex ey et ez
ensuite j'ai des ensemble de PtBasic
et des ensembles de PtCal
je dois pouvoir realises sur les ensemble de PtCal toutes les operations possible sur les ensembles de PtBasic plus d'autres
le pb si je vais herite SetPtCal de SetPtBasic c'est que le std::vector<PtBasic*> Pt m'oblige à definir des fonctions virtuelle debile dans PtBasic (Ex() etc....) ces fonctions n'ont aucune raison d'etre puisque le PtBasic n'a pas de ex...
bref je n'arrive pas à voir comment organiser ma hierarchie pour pouvoir virer ces stupides :
de l'objet PtBasic
et que les appele à SetPtCal::Pt->Ex() depuis les fonctions externes aux objets fonctionnent !!!
j'avais penser à ecraser
dans SetPtCal par :
mais ca n'est pas accepté parceque surement pas correct...
merci a ceux qui prendront le temps de m'aider
David