simple probleme sur les objets (je debute)

simple probleme sur les objets (je debute) - C++ - Programmation

Marsh Posté le 11-11-2002 à 19:51:01    

au depart jai une classe vehicule du type suivant  
 

Code :
  1. //definition de la classe vehicule
  2. class vehicule{
  3. private:
  4. char noplaque[15];
  5. char nopolice[15];
  6. int  placeparking;
  7. bool etat;
  8. char date[128];
  9. char time[128];
  10. public:
  11. void identifier(char *);
  12. void immatriculer(char *);
  13. void assurer(char *);
  14. char * getnoplaque();
  15. char * getnopolice();
  16. bool islibre();
  17. void setlibre();
  18. void setprit();
  19. void supprimer_immatriculation();
  20. void supprimer_assurance();
  21. void assigner_place_parking(int);
  22. int getplaceparking();
  23. void settime(char *,char *);
  24. char* gettime();
  25. char* getdate();
  26. };


 
jai cree une autre classe tabvehicule qui contient un tableau dobjet de type vehicule
 
 
 
 

Code :
  1. class  tabvehicule :public vehicule{
  2. private:
  3. vehicule tab[5];
  4. public:
  5. };


 
 
 
bon le probleme est de pouvoir utilise le tableau vu quil est en private. comme solution jai pense a faire herite tabvehicule de vehicule de facon a quil ait les meme membres et fct  et ensuite utiliser une fonction de tabvehicule pour associer le resultat ds le tableau (genre set(i) ou i est lindice, dans set yaurai un truc du genre tab[i]=..membredetabvehiculederive..)
 
 
voila le prob c que jarrive pas a ecrire ca  :sweat:  et que ya peut etre dautre methodes plus simple pour resoudre le probleme
 
note : jai peut etre dit des conneries je debute en c++ (mais pas c ca, ca va  :p )


Message édité par red faction le 11-11-2002 à 19:54:52
Reply

Marsh Posté le 11-11-2002 à 19:51:01   

Reply

Marsh Posté le 11-11-2002 à 20:43:30    

et pourquoi pas faire un accesseur ?
 
getVehicule(int num);


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 11-11-2002 à 21:02:59    

Tetedeiench a écrit a écrit :

et pourquoi pas faire un accesseur ?
 
getVehicule(int num);




 
qui retourne un objet de type vehicule???
jy avait pense , ca marchait bien le probleme c que ca ne fait que lire ... pas modifier les objets vehicule

Reply

Marsh Posté le 11-11-2002 à 21:46:26    

Renvoie une référence :
vehicule& getVehicule(int num)
{
      return tab[num];
}

Reply

Marsh Posté le 11-11-2002 à 21:49:35    

Mais une question que je me suis souvent posée : puisqu'avec getVehicule on peut alors accéder comme on veut au membres du tableau, pourquoi ne pas carrément mettre le tableau en public?

Reply

Marsh Posté le 11-11-2002 à 23:13:39    

Ace17 a écrit a écrit :

Mais une question que je me suis souvent posée : puisqu'avec getVehicule on peut alors accéder comme on veut au membres du tableau, pourquoi ne pas carrément mettre le tableau en public?



C'est pour séparer la partie interface de l'implémentation. Tu dois pouvoir utiliser ton objet sans savoir qu'il utilise un tableau. Ainsi, le jour où tu souhaiteras en changer (liste chainée, base de données...), tu ne change pas l'interface, ni les programmes qui l'utilisent.

Reply

Marsh Posté le 12-11-2002 à 01:59:14    

Ace17 a écrit a écrit :

Mais une question que je me suis souvent posée : puisqu'avec getVehicule on peut alors accéder comme on veut au membres du tableau, pourquoi ne pas carrément mettre le tableau en public?




 
tu ne te soucies pas de savoir quand et comment il est construit, modifie, recalcule et tu peux faire le compte des gens qui ont des references vers cet objet..
 

  • Exemple, tu as un evaluation paresseuse

d'une variable (chaque changement d'etat de l'objet necessite un recalcul couteux), plutot que de refaire le calcul a chaque fois, tu le fais qu'au moment ou tu dois utiliser la valeur et donc tu gagnes en temps de calcul:
 

Code :
  1. toto.setPosition(maPos); // pas de recalcul
  2. toto.setMatrix(maMatrice); // pas de recalcul
  3. toto.getTransformedPosition(maNouvellePos); // ici le recalcul


 
Conclusion si tu avais eu acces directement a la valeur TransformedPosition tu aurais du faire le calcul deux fois (au moins dans cet exemple) apres chaque set.
 

  • Deuxieme Exemple, tu as un objet que tu ne desires pas allouer en meme temps que l'objet dont il est membre (allouer dans le constructeur ou dans une methode par un new).  


Si tu fais ca:

Code :
  1. struct Toto {
  2.   monType membre;
  3. };


tu es bloque avec ton implementation.
Alors que si tu avais eu un accesseur tu aurais eu largement le choix sur l'implementation:
 

Code :
  1. class Toto {
  2.   monType membre;
  3.   public:
  4.   monType & getMembreRef(){return membre;}
  5. };


Code :
  1. class Toto {
  2.   monType* pMembre;
  3.   public:
  4.   monType & getMembreRef(){return *membre;}
  5. };


L'interface est la meme, l'implantation est differente.
 

  • Dans le meme style:

tu veux incrementer le compteur de reference a chaque fois que quelqu'un te demande un pointeur ou une reference sur un de tes objets. Evidemment ce n'est pas possible avec le membre public.
 
alors qu'avec l'accesseur:
 

Code :
  1. class Toto {
  2.   monType *pMembre;
  3.   public:
  4.   monType * getMembrePointer ()
  5.   {
  6.      pMembre->AddRef();
  7.      return pMembre;
  8.   }
  9. };


 

  • Ou tu as une classe Toto que tu veux heriter d'une classe Tata, mais en changeant la methode d'acces a la variable membre.

Si Tata l'implemente sous forme d'un membre public, ce n'est pas possible. Par contre si Tata avait utilise un accesseur ce serait beaucoup plus simple.
 
Exemple:

Code :
  1. class Tata {
  2.   dword state;
  3.   public:
  4.   bool hasfailed() {
  5.     return state != 0;
  6.   }
  7. }
  8. class Toto: public Tata {
  9.   static const dword failbit;
  10. public:
  11.   bool hasFailed() {
  12.     return (failbit & state)==failbit;
  13.   }
  14. }


 
Je n'ai pas mis de virtual mais ca depend l'utilisation que tu veux en faire.
 
LeGreg

Reply

Marsh Posté le 12-11-2002 à 02:10:38    

Renvoyer une référence non-const et considérer que l'accesseur ne protège que des dépassements ?
Le conteneur héritant de son contenu est Une Maivais Idée©. Ça se comprends mieux avec les templates...

Code :
  1. const int tabsize= 5;
  2. class  tabvehicule{
  3. private:
  4. vehicule tab[tabsize];
  5. public:
  6. vehicule& getVehicule(int num){
  7.  if(num<=0 || tabsize<=num)
  8.   /*apprendre les exceptions*/;
  9.  return tab[num];
  10. }
  11. };


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 12-11-2002 à 02:18:47    

Citation :

Le conteneur héritant de son contenu est Une Maivais Idée©. Ça se comprends mieux avec les templates...


 
[OT]Vaut-il mieux un contenu heritant de son contenant?
 
Oh je crois que c'est un concept valide
puisqu'on dit "boire un verre" pour dire que l'on boit l'eau dans le verre.
 
Donc comme l'interface est un handle, on peut appliquer a eau et a verre les memes methodes.[/OT]
 
je divague..
 
LeGreg

Reply

Marsh Posté le 12-11-2002 à 02:33:20    

en tout k merci jai encore progresse
 
 
jen demendais pas tant  :)


Message édité par red faction le 12-11-2002 à 02:33:31
Reply

Marsh Posté le 12-11-2002 à 02:33:20   

Reply

Marsh Posté le 12-11-2002 à 10:17:15    

chui perdu ... faudra me la refaire plus lentement avec les histoires de verres contenants contenus ds l'eau ...


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 13-11-2002 à 04:01:24    

legreg a écrit a écrit :

Vaut-il mieux un contenu heritant de son contenant?



[choper la perche]
Ah pardon cher confrère, je vous arrête là !
 
Dans ce cas-là, ce n'est qu'un simple transfert de propriété d'un contenu (eau) à son conteneur unitaire (verre).
L'eau étant une unité, et sa quantité une de ses propriétés.
Le conteneur n'ayant qu'un élément, on perd la notion de collection (on ne trie pas un verre), et il est alors logique d'accéder directement au contenu puisqu'il ne peut y avoir d'ambigüité sur l'élément concerné.
[/choper la perche]
 
A propos...
 
Il me semble qu'il manque au conteneurs C++ la distinction entre l'objet contenu et l'emplacement mémoire (case) qui le contient.
Je pense à l'échange d'éléménts entre liste chaînées, où on ne peut spécifier s'il faut copier/swapper les objets, ou juste rabouter des pointeurs.
Je dis ça de façon théorique, je ne me suis pas encore servi des conteneurs C++ sérieusement...
 
OT  :??:


Message édité par Musaran le 13-11-2002 à 04:02:15

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 13-11-2002 à 05:14:40    

Musaran a écrit a écrit :

 
OT  :??:




 
off-topic
(ou legerement diversion du sujet original)
 
LeGreg

Reply

Sujets relatifs:

Leave a Replay

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