Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1940 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  simple probleme sur les objets (je debute)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

simple probleme sur les objets (je debute)

n°243132
red factio​n
Posté le 11-11-2002 à 19:51:01  profilanswer
 

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
mood
Publicité
Posté le 11-11-2002 à 19:51:01  profilanswer
 

n°243151
Tetedeienc​h
Head Of God
Posté le 11-11-2002 à 20:43:30  profilanswer
 

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 !
n°243162
red factio​n
Posté le 11-11-2002 à 21:02:59  profilanswer
 

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

n°243190
Ace17
Posté le 11-11-2002 à 21:46:26  profilanswer
 

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

n°243191
Ace17
Posté le 11-11-2002 à 21:49:35  profilanswer
 

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?

n°243254
mrbebert
Posté le 11-11-2002 à 23:13:39  profilanswer
 

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.

n°243265
LeGreg
Posté le 12-11-2002 à 01:59:14  profilanswer
 

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

n°243268
Musaran
Cerveaulté
Posté le 12-11-2002 à 02:10:38  profilanswer
 

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
n°243270
LeGreg
Posté le 12-11-2002 à 02:18:47  profilanswer
 

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

n°243271
red factio​n
Posté le 12-11-2002 à 02:33:20  profilanswer
 

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


Message édité par red faction le 12-11-2002 à 02:33:31
mood
Publicité
Posté le 12-11-2002 à 02:33:20  profilanswer
 

n°243336
blackgodde​ss
vive le troll !
Posté le 12-11-2002 à 10:17:15  profilanswer
 

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


---------------
-( BlackGoddess )-
n°243880
Musaran
Cerveaulté
Posté le 13-11-2002 à 04:01:24  profilanswer
 

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
n°243883
LeGreg
Posté le 13-11-2002 à 05:14:40  profilanswer
 

Musaran a écrit a écrit :

 
OT  :??:




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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  simple probleme sur les objets (je debute)

 

Sujets relatifs
[VB] Probleme VB et base de donnéeprobleme d'envoi de formulaire
petite probleme dedébutantproblème apache...
voila mon probleme resize des fenetre en fct de la resol[XML] comparaison de syntaxe, probleme d'occurrence
Problème avec 2 actions?[PHP] Probleme avec MySql: Erreur que je n'arrive pas à résoudre
Probleme avec DreamweaverProbleme lorsque je maximise une fentre sous Visual C++
Plus de sujets relatifs à : simple probleme sur les objets (je debute)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR