[C++] Surchage de l'opérateur []

Surchage de l'opérateur [] [C++] - C++ - Programmation

Marsh Posté le 28-12-2007 à 20:25:19    

Hello tout le monde,
 
je voulais juste savoir comment surcharger l'opérateur [] de manière statique pour je puisse écrire un truc du genre :

Code :
  1. Recette::Recueil[i]


 
Voici le reste du code (qui marche pas  :D juste pour donner l'idée):

Code :
  1. class Recette : public Ingredient
  2. {
  3. private:
  4.     static vector<Recette*> _recettes;
  5.     [...]
  6. public:
  7.     [...]
  8.     class Recueil
  9.     {
  10.            static Recette& operator[](unsigned int i,vector<Recette*> & _recettes); // ???
  11.     };
  12. };
  13. Recette& operator[](unsigned int i,vector<Recette*> & _recettes)
  14. {
  15.     return *_recettes[i];
  16. }


Message édité par Cyrk13 le 28-12-2007 à 20:36:08
Reply

Marsh Posté le 28-12-2007 à 20:25:19   

Reply

Marsh Posté le 28-12-2007 à 21:31:24    

Salut,
 
Tu devrais plutôt définir un livre de recettes externe, tu n'aurais pas besoin de ce static inutile et ce sera plus propre. Et au passage, un livre de recette peut très bien être un typedef sur vector ou map (si tu as des noms) etc...
 
En plus clair, je ne vois:
> ni pourquoi Recette dérive d'Ingredient,
> ni pourquoi Recueil est une classe interne à Recette,
> ni pourquoi tu as besoin de ces membres statiques.

Reply

Marsh Posté le 28-12-2007 à 22:09:52    

Oui je sais, la construction de ces classes est assez crade mais imposée,je n'ai pas le choix :(

Message cité 1 fois
Message édité par Cyrk13 le 28-12-2007 à 22:10:34
Reply

Marsh Posté le 28-12-2007 à 22:51:44    

Cyrk13 a écrit :

Oui je sais, la construction de ces classes est assez crade mais imposée,je n'ai pas le choix :(


 
stuen blague ?
 
si c'est pour un vrai job, change de job.
si c'est pour un Tp, change d'école.
 
En 10s ,
 
Une Recette AGGREGE des ingredients.
Un Receuil AGGREGE des recettes.
 
Point d'héritage mais de l'aggrégation (à coup de std::vector ca devrait suffire)

Reply

Marsh Posté le 29-12-2007 à 02:38:22    

s'pour un TP  :whistle:

Reply

Marsh Posté le 29-12-2007 à 10:25:57    

et ton prof te demandes EXPLICITEMENT de faire ça ?
C'est quoi l'école ou la fac ?

Reply

Marsh Posté le 29-12-2007 à 10:53:51    

la fac, en fait à partir d'un code donné (celui du main) et d'un diagramme UML, on doit deviner tout le reste. Et parmis ce code, il y a la ligne :

Code :
  1. Recette::Recueil[i]


Mais je pense que cette construction n'est juste qu'un moyen pour nous confronter à cette difficulté.

Reply

Marsh Posté le 29-12-2007 à 10:56:25    

il te dise pas de faire du static ?
Receuil::Recueil[i] c'ets juste une notation pr signifier qu'il faut un operator[]
 
De tte façon, les operator[] ne peuvent pas êtres des membres de classes, juste des memebres d'insatcnes.
 
Quelle fac ?

Reply

Marsh Posté le 29-12-2007 à 11:19:10    

L3 Info à Nantes.
Recette::Recueil[i] ==> Recette::Receuil.operator[](i) si je ne me trompe pas et vu que Recueil est une classe et non une instance j'en ai déduit que que la méthode doit être static. Après il y a peut-être un autre moyen mais je trouve pas :(

Reply

Marsh Posté le 29-12-2007 à 14:15:28    

Citation :

thierry lapresté télécharger


Ok, je rajoute su rma liste de fac moche :o

 

Y a pas moyen [] est forcement membre d'instance.
Une truc débile, rapide qui marche

 
Code :
  1. class Ingredient
  2. {
  3.   public:
  4.   Ingredient(const std::string& nom) : mNom(nom) {}
  5.   Ingredient( const Ingredient& src) : mNom(src.mNom) {}
  6.   ~Ingredient() {}
  7.   Ingredient& operator=( const Ingredient& src )
  8. {
  9.    if(src != this ) mNom = src.nom;
  10.    return *this;
  11. }
  12.   const std::string& identifiant() const { return mNom; }
  13.   std::string& identifiant() { return mNom; }
  14.   private :
  15.   std::string mNom;
  16. };
  17. class Receuil
  18. {
  19.   public:
  20.   Receuil(const std::string& nom, size_t nbRec) : mNom(nom), mRecettes(nbRec) {}
  21.   Receuil( const Receuil& src) : mNom(src.mNom), mRecettes(src.mRecettes) {}
  22.   ~Receuil() {}
  23.   Receuil& operator=( const Receuil& src )
  24. {
  25.    if(src != this )
  26.   { 
  27.     mNom = src.nom;
  28.     mRecettes= src.mRecettes;
  29.   }
  30.    return *this;
  31. }
  32.   const std::string& identifiant() const { return mNom; }
  33.   std::string& identifiant() { return mNom; }
  34.   const Recette& operator[](size_t i) const { return mRecettes[i]; }
  35.   Recette& operator[](size_t i){ return mRecettes[i]; }
  36.   private :
  37.   std::string mNom;
  38.   std::vector<Recette> mRecettes;
  39. };
 

C'ets qd même pas compliqué ...


Message édité par Joel F le 29-12-2007 à 14:35:02
Reply

Marsh Posté le 29-12-2007 à 14:15:28   

Reply

Marsh Posté le 31-12-2007 à 15:49:52    

Ué merci, c'est sûr que c'est plus cohérent et plus simple mais l'instruction Recette::Recueil[i] ne marchera pas :(

Reply

Marsh Posté le 01-01-2008 à 12:13:56    

normal elle a pas de jambes :o
 
C'ets quoi le message d'erreur ?

Reply

Marsh Posté le 01-01-2008 à 13:47:17    

error : `static Recette& Recette::Recueil::operator[] (unsigned int, Recette::Recueil& )' must be a nonstatic member function

Reply

Marsh Posté le 01-01-2008 à 14:10:02    

tu ecoutes ce que je te dis (et ce que dis ton compialteur apr la même occassion). Tu ne peux pas avori de surcharge d'opertaeur statique.
 
LA seule solution est celle que je viens de donner.

Reply

Sujets relatifs:

Leave a Replay

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