[c++] template -> sujet d'examen 2004 (problème de compréhension)

template -> sujet d'examen 2004 (problème de compréhension) [c++] - C++ - Programmation

Marsh Posté le 06-05-2005 à 11:06:14    

voici le sujet d'un exam des années précédentes :
 

Code :
  1. void main(){
  2.   Article<Libelle><Prix> cl("Dupond" );
  3.   cout << c1[0] << endl ; // affiche le nom du produit
  4.   cout << c1[1] << endl ; // affiche le prix du produit
  5.   Article c2;
  6.   c2[0] = new Libelle("vélo" );
  7.   c2[1] = new Prix(199.0,"euros" );
  8.   cout << c2[0] << endl ; // affiche le nom du produit
  9.   cout << c2[1] << endl ; // affiche le prix du produit


la question est :
Déclarer et implémentez les classes, méthodes ou fonctions nécessaire au bon fonctionnement du programme ci dessus
 
après lecture du sujet je me pose beaucoup de question.
on arrive à une solution du type :

Code :
  1. template <class Libelle, class Prix> class maClass{
  2. private :
  3. Prix monPrix;
  4. Libelle monLibelle;
  5. };


le problème vient de la surcharge des operator [] puisque dans un cas on va utiliser les [] pour de l'affichage et de l'autre pour de l'affectation. or les deux fonctions auront le "même" prototype à savoir :

Code :
  1. // pour l'affichage
  2. template <class Libelle, class Prix> void article<Libelle,Prix>::operator[](int monEntier){
  3.   if (monEntier==0){
  4.     cout<<monPrix.thePrix;
  5.     cout<<monPrix.laDevise;
  6.   }
  7.   else {
  8.     cout<<monLibelle.leLibelle;
  9.   }
  10. }
  11. // pour l'affectation
  12. template <class Libelle, class Prix> Prix& article<Libelle,Prix>::operator[](int monEntier){
  13.   if (monEntier==0){
  14.     return &monPrix;
  15.   }
  16. }
  17. template <class Libelle, class Prix> Libelle& article<Libelle,Prix>::operator[](int monEntier){
  18.   if (monEntier==1){
  19.     return &monLibelle;
  20.   }
  21. }


dans ce cas le compilateur peut-il faire la difference entre les trois fonctions déclarées ci dessus puisqu'elles ont les même entrées mais des types retournés différents ?

Reply

Marsh Posté le 06-05-2005 à 11:06:14   

Reply

Marsh Posté le 06-05-2005 à 11:10:06    

Article<Libelle><Prix>
 
spa trop possible ça ...

Reply

Marsh Posté le 06-05-2005 à 11:12:57    

l'operator[] ne RENVOIT JAMAIS void
 
Sa forme canonique est
 

Code :
  1. TYPE operator[]( size_t i ) const;
  2. TYPE& operator[]( size_t i );


 
Ce qui m'embete plus c'est d'avoir un [] qui renvoit deux type different selon la valeur de i ....
 
Libelle et Prix derivent ils d'une même classe mére ??

Reply

Marsh Posté le 06-05-2005 à 11:13:41    

Taz a écrit :

Article<Libelle><Prix>
 
spa trop possible ça ...


 
Je l'avais loupé celui la ..
jepense qu'il voulait ecrire :
 
Article<Libelle,Prix>

Reply

Marsh Posté le 06-05-2005 à 11:21:16    

non c'est bien le sujet. j'ai bien vérifié tout ce que j'ai marqué dans le sujet est bien recopié.
ensuite je ne sais pas si prix et libelle dérive d'une même classe mère. je les auraient implémentés de façon distinct sans aucune dérivation ou héritage.
comme ça :

Code :
  1. class Prix{
  2. }


et  

Code :
  1. class Libelle{
  2. }


Message édité par lordankou le 06-05-2005 à 11:25:48
Reply

Marsh Posté le 06-05-2005 à 11:25:37    

lordankou a écrit :

non c'est bien le sujet. j'ai bien vérifié tout ce que j'ai marqué dans le sujet est bien recopié.


 
Ben c'est un sujet plein d'erreur de syntaxe  :sarcastic:

Reply

Marsh Posté le 06-05-2005 à 11:27:23    

Joel F a écrit :

Ben c'est un sujet plein d'erreur de syntaxe  :sarcastic:


plein ? y'en a d'autre comme ça ? juste histoire de savoir si je dois batailler comme un abruti pour résoudre un ennoncé faux  :pt1cable:

Reply

Marsh Posté le 06-05-2005 à 11:31:54    

Code :
  1. void main()
  2. {
  3.   Article<Libelle><Prix> cl("Dupond" ); // ERREUR : Article<Libelle,Prix>
  4.   cout << c1[0] << endl ; // affiche le nom du produit
  5.   cout << c1[1] << endl ; // affiche le prix du produit
  6.   Article c2; // ceci implique default template parameters
  7.   c2[0] = new Libelle("vélo" );
  8.   c2[1] = new Prix(199.0,"euros" ); // ceci implqiue que [] retourne un POINTEUR
  9.   cout << c2[0] << endl ; // affiche le nom du produit
  10.   cout << c2[1] << endl ; // affiche le prix du produit


 
L'astuce est la suivante :D
 

Code :
  1. template<class L = Libelle, class P = Prix>
  2. class Article
  3. {
  4. public :
  5. // Forme canonique de Coplien ici
  6. ??? operator[]( size_t i ) const
  7. {
  8. if(i == 0 ) return lib else return px;
  9. }
  10. const ???& operator[]( size_t i )
  11. {
  12. if(i == 0 ) return lib else return px;
  13. }
  14. private :
  15. L* lib;
  16. P* px;
  17. };
  18. ostream& operator <<( ostream& os, const Libelle* l )
  19. {
  20. return os << l->nom();
  21. }
  22. ostream& operator <<( ostream& os, const Prix* l )
  23. {
  24. return os << p.->val() << " " << p->devise();
  25. }


 
Maintenant si Libelel & Prix en derive pas d'une class Base, je vois pas comment ca peut marcher ...


Message édité par Joel F le 06-05-2005 à 11:32:17
Reply

Marsh Posté le 06-05-2005 à 11:34:30    

ca a l'air tordu, je dis peut etre des connerie mais (dans le cas ou libelle et prix ne derivent pas d'une classe polymorphique) Article semble etre une collection de pair<Libelle*,Prix*> avec ses membres de constructions et assignations pour Libelle* et Prix*, operator[] peut retourner std::string

Reply

Marsh Posté le 06-05-2005 à 11:36:56    

certes mais comment va fonctionner l'operator[] d'affectation [:pingouino]

Reply

Marsh Posté le 06-05-2005 à 11:36:56   

Reply

Marsh Posté le 06-05-2005 à 11:40:12    

ben la pair faites maison (type membre de Article) pourra etre construite avec soit const Libelle* soit const Prix* en initialisant l'autre pointeur à 0

Reply

Marsh Posté le 06-05-2005 à 11:41:17    

plutot sans modifier le deuxieme ;)

Reply

Marsh Posté le 06-05-2005 à 11:43:49    

oui, l'important c'est d'avoir un pointeur initialisé par new et l'autre à 0 pour savoir a quel type on a affaire

Reply

Marsh Posté le 06-05-2005 à 11:48:34    

ma femelle et moi on a pensé à un truc (moi macho ? nannnnn  :D)
 
si [] retourne soit l'adresse vers un objet de type Prix ou Libelle (selon que l'entier passé en paramètre soit 1 ou 0) on peut donc effectuer l'affectation suivante :

Code :
  1. c2[0] = new Libelle("vélo" );
  2. c2[1] = new Prix(199.0,"euros" );


 
de plus si on surcharge l'operateur << pour la class Libelle et Prix on pourra donc faire :

Code :
  1. cout << c2[0] << endl ; // affiche le nom du produit
  2. cout << c2[1] << endl ; // affiche le prix du produit


 
je me trompe ou c'est plus ou moins ça ?

Reply

Marsh Posté le 06-05-2005 à 11:51:41    

dans ce cas il faut que Libelle et Prix derivent d'une meme classe polymorphique, mais comment expliquer cette instanciation du modele Article
Article<Libelle,Prix>  ?

Reply

Marsh Posté le 06-05-2005 à 11:57:53    

lordankou a écrit :


je me trompe ou c'est plus ou moins ça ?


 
style genre, tu lis le sposts des gens ....

Reply

Marsh Posté le 06-05-2005 à 14:33:42    

Joel F a écrit :

style genre, tu lis le sposts des gens ....


 
si je lis le post mais j'avoue que j'y comprends pas grand chose (on a programmer aucun exemple sur le polymorphisme et l'héritage et on aurai du programmer un exemple avec les templates mais avec les réformes LMD le nombre de cours à diminuer donc...) donc j'essaie aussi de mon coté de voir si des trucs que je propose peuve marcher !  :cry:

Reply

Marsh Posté le 07-05-2005 à 12:12:52    

au fait concernant l'erreur suivante :
Article<Libelle><Prix> cl("Dupond" );
il ne semble pas que ça soit une erreur puisque sur un autre sujet on retrouve la même chose.

Reply

Marsh Posté le 07-05-2005 à 12:48:06    

ah si tu le dis.

Reply

Marsh Posté le 07-05-2005 à 23:44:50    

lordankou a écrit :

au fait concernant l'erreur suivante :
Article<Libelle><Prix> cl("Dupond" );
il ne semble pas que ça soit une erreur puisque sur un autre sujet on retrouve la même chose.


 
J'aurais trouver le smiley avec la corde je l'aurais bien utiliser ...
revise tes cours bordel ! ou ouvre le Stroustrup !!!

Reply

Marsh Posté le 08-05-2005 à 11:57:12    

je comprends absoluement pas votre réaction là !
je me pose des questions sur un sujet d'examen. là vous me dites que le sujet est faux et que ça ne peut pas marcher.
ensuite je chercher des solutions tout en essayant de comprendre les réponses que vous me donnez (bordel je suis qu'à bac+2 n'oubliez pas !)
là je rajoute que le sujet n'a pas l'air faux puisqu'on retrouve la même chose dans un autre devoir et en réponse j'ai droit à :

Citation :

J'aurais trouver le smiley avec la corde je l'aurais bien utiliser ...


Citation :

ah si tu le dis.


 
alors soit le prof est con ce que je doute (d'ailleurs taz si je me trompe pas tu es étudiant à pau donc tu connais ce prof -> il s'agit de bruel) ou alors vous ne savez pas répondre et vous préférez garder la face en disant que le sujet est faux et vous utilisez des termes qu'un newbie ne peut pas comprendre pour paraitre plus intelligent !  
j'ai fais l'effort de comprendre vos réponses alors faites l'effort de répondre autrement qu'en me traitant comme un mec insignifiant !

Reply

Marsh Posté le 08-05-2005 à 11:59:19    

ben Bruel s'est planté.

Reply

Marsh Posté le 08-05-2005 à 12:15:23    

Taz a écrit :

ben Bruel s'est planté.


 
ok je veux bien une fois ça arrive à tout le monde mais deux années d'affilées je trouve ça bizarre

Reply

Marsh Posté le 08-05-2005 à 13:55:55    

ben écoute, prends ton compilateur et regarde.

Reply

Marsh Posté le 16-05-2005 à 14:48:53    

tu seras là au tutorat ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed