[Début en C++] Mon code est-il plus ou moins bon? :-S

Mon code est-il plus ou moins bon? :-S [Début en C++] - C++ - Programmation

Marsh Posté le 24-01-2006 à 18:51:06    

:hello:  
 
J'ai commencé C++ cet aprèm (enfin plus ou moins on dira...vu que ca fait 4mois que j'ai des cours là-dessus, mais que j'ai rien foutu  :pfff:  :non: ) et j'aimerais bien prendre les bon réflexes dès aujourd'hui :), alors si vous pouviez me dire ce qui joue pas dans mes classe, ca serait cool ;).
 
Développé sous C++ Builder 6:
 

Code :
  1. [Personne.h]
  2. class Personne
  3. {
  4.         int cptPersonne;
  5.         public:
  6.                 Personne();
  7.                 Personne(AnsiString nom, AnsiString prenom, int age);
  8.                 void Affiche();
  9.                 void AfficheTab();
  10.                 void SetNom(AnsiString nom);
  11.                 ~Personne();
  12.         protected:
  13.                 Personne* tab;
  14.                 AnsiString nom;
  15.                 AnsiString prenom;
  16.                 int age;
  17. };
  18. class Employe : public Personne
  19. {
  20.         public:
  21.                 Employe(AnsiString nom, AnsiString prenom, int age, double salaire);
  22.                 void Affiche();
  23.         protected:
  24.                 double salaire;
  25. };
  26. [Personne.cpp]
  27. Personne::Personne()
  28. {
  29.         Personne("unknown", "unknown", 0);
  30. }
  31. Personne::Personne(AnsiString nom, AnsiString prenom, int age)
  32. {
  33.         this->nom = nom;
  34.         //cout << this->nom;
  35.         this->prenom = prenom;
  36.         this->age = age;
  37.         ++this->cptPersonne;
  38. }
  39. void Personne::SetNom(AnsiString nom)
  40. {
  41.         this->nom = nom;
  42. }
  43. void Personne::Affiche()
  44. {
  45.      cout << "\n-----------------------------------\n";
  46.      cout << this->nom << " " << this->prenom;
  47.      cout << "\nAge: " << this->age;
  48. }
  49. void Personne::AfficheTab()
  50. {
  51. }
  52. Personne::~Personne()
  53. {
  54.         delete this->tab;
  55. }
  56. Employe::Employe(AnsiString nom, AnsiString prenom, int age, double salaire) : Personne(nom, prenom, age)
  57. {
  58.         this->salaire = salaire;
  59. }
  60. void Employe::Affiche()
  61. {
  62.         Personne::Affiche();
  63.         cout << "\nSalaire: " << this->salaire;
  64. }


 
En plus des erreurs de style, j'ai un bug... si je fais ca:
 

Code :
  1. Personne* p1 = new Personne();
  2.         Personne* p2 = new Personne("Maurice", "Jean", 24);
  3.         Employe* e1 = new Employe("Jeanne", "Darc", 22, 6666.00);
  4.         p1->Affiche();
  5.         e1->SetNom("Sumi" );
  6.         e1->Affiche();
  7.         p2->Affiche();


 
-> à l'affichage le p1 m'affiche des champs vide pour les variables de classe!!! pige vraiment pas! -> il devrait m'afficher "unknown unknown" et 0 pour l'age...
 
Merci pour votre aide!!
 
++


Message édité par le_duc le 24-01-2006 à 18:52:25
Reply

Marsh Posté le 24-01-2006 à 18:51:06   

Reply

Marsh Posté le 24-01-2006 à 18:52:52    

Bon je suis pas très balaise en C++ mais le mieux ça serait que tu nous donne clairement les erreurs que tu obtients à la compilation :)

Reply

Marsh Posté le 24-01-2006 à 19:02:18    

bah tout fonctionne à la compilation! et l'affichage également (sauf pour le p1 qui merde comme expliqué!)
 
mais c pas ca que j'aimerais savoir, c'est si le style est bon ou pas.... (genre si je devrais pas mettre des pointeurs à des endroit ou j'en ai pas mis!)

Reply

Marsh Posté le 24-01-2006 à 19:10:15    

Code :
  1. Personne::Personne()
  2. {
  3.        Personne("unknown", "unknown", 0);
  4. }


ça serait pas plutot :
 

Code :
  1. Personne::Personne()
  2. {
  3.        new Personne("unknown", "unknown", 0);
  4. }


J'était comme toi j'écoutais pas en cours, j'en ai pas fais depuis des mois alors je m'avance pas :D

Reply

Marsh Posté le 24-01-2006 à 19:14:36    

j'ai test ca change à rien :D
 
ce qui est bizarre c'est que les "unknown" sont bien attribués (si j'enlève la ligne qui est en commentaire dans le constructeur, ca m'affiche "unknown" ), mais à l'affichage c pas digéré :D

Reply

Marsh Posté le 24-01-2006 à 19:22:14    

:heink:
Bon désolé je peut pas t'aider plus :'(

Reply

Marsh Posté le 24-01-2006 à 19:26:39    

Code :
  1. Personne::Personne()
  2. {
  3.        Personne("unknown", "unknown", 0);
  4. }


 
heuh je suis clairement pas convaincu, la, jme demande si tu crée pas un objet Personne dans le vide. Set les valeurs a la main dans ce constructeur (ou fais une fonction pour ca)
 

Reply

Marsh Posté le 24-01-2006 à 19:45:53    

ouais, mais pour setter les valeur je dois créer un objet... avant de pouvoir le faire! Donc je le ferais après le Personne("unknown", "unknown", 0); (car l'objet est crée, c'est sûr!) mais ca ferait carrément pas propre du tout je trouve :S
 
en java ca marche nickel en tout cas :D
 
enfin vais test

Reply

Marsh Posté le 24-01-2006 à 19:56:27    

   

Code :
  1. Personne::Personne()
  2.        {
  3.             nom="unknown";
  4.             prenom="unknown";
  5.             age= 0;
  6.       }


Reply

Marsh Posté le 24-01-2006 à 20:06:31    

bah oui... mais ca se répète avec le 2e constructeur... pas génial!
 
mais ca marche définitivement pas en appelant le 2e constructeur

Reply

Marsh Posté le 24-01-2006 à 20:06:31   

Reply

Marsh Posté le 24-01-2006 à 20:07:53    

le_duc a écrit :

ouais, mais pour setter les valeur je dois créer un objet...


Oui. Et dès que tu es entré dans le corp du constructeur, ton objet est déja crée, initialisé ou non ...
 

Citation :

Donc je le ferais après le Personne("unknown", "unknown", 0); (car l'objet est crée, c'est sûr!)


Non. Tu crées un temporaire, et tu ne t'en sers même pas.
 
 

Reply

Marsh Posté le 24-01-2006 à 20:14:38    

sankukai8 a écrit :

Code :
  1. Personne::Personne()
  2.        {
  3.             nom="unknown";
  4.             prenom="unknown";
  5.             age= 0;
  6.       }



 
Au secour ! ( et encore c'est le plus beau constructeur de ce thread :o )
 

Code :
  1. Personne::Personne()
  2.     : nom( nom ), prenom( prenom ), age( age ) // tu peux mettre des noms différents
  3. {}


 

Code :
  1. Personne::Personne( std::string const& nom, std::string const& prenom, int age )
  2.     : nom( nom ), prenom( prenom ), age( age ) // tu peux mettre des noms différents
  3. {}


 
( J'ai utilisé std::string au lieu de AnsiString, elle n'est généralement pas assez mauvaise pour en utiliser une autre )

Reply

Marsh Posté le 24-01-2006 à 20:22:51    

Quelques corrections en vrac :
 
 

Code :
  1. [Personne.h]
  2. class Personne
  3. {
  4.         static int cptPersonne; // si l'objectif est de compter les instances de Personne
  5.         public:
  6.                 Personne();
  7.                 Personne( std::string const& nom, std::string const& prenom, int age );
  8.                 virtual void Affiche() const;
  9.                 void AfficheTab(); // ?
  10.                 void SetNom(std::string const& nom);
  11.                 virtual ~Personne() {}
  12.         private:
  13.        
  14.                 std::string nom;
  15.                 std::string prenom;
  16.                 int age;
  17. };
  18. class Employe : public Personne
  19. {
  20.         public:
  21.                 Employe( std::string const& nom, std::string const& prenom, int age, double salaire );
  22.                 virtual void Affiche() const;
  23.         private:
  24.                 double salaire;
  25. };
  26. Employe::Employe(std::string const& nom, std::string const& prenom, int age, double salaire)
  27.     : Personne(nom, prenom, age),
  28.     salaire( salaire )
  29. {}

Reply

Marsh Posté le 24-01-2006 à 20:46:26    

yes!!!
 
merci beaucoup ++fab! :jap:
 
vais appliquer tout ca et me renseigner sur les trucs que je capte pas genre les "&" :D ou le virtual :S
 
merci pour tes corrections.

Reply

Marsh Posté le 24-01-2006 à 20:59:36    

donc je dois aussi ajouter  
 

Code :
  1. virtual void Affiche() const
  2. {
  3. }


 
pige pas trop ce "const" non plus...
 
(java c'est la rigolade à  coté de C++ :D)

Reply

Marsh Posté le 24-01-2006 à 21:01:14    

c'est juste pour signifier que ta fonction ne modifiera pas ses membres. Ca sert si plus tard tu as :
 
 
const Personne * truc = ...
 
le compilo t'interdira de modifier une var membre de truc, et d'appeler toute fonction non const de Personne. Mettre des consts la ou nécessaire est (imho) une bonne habitude a prendre

Reply

Marsh Posté le 24-01-2006 à 21:07:21    

okay, thx :jap:

Reply

Marsh Posté le 24-01-2006 à 21:32:37    

pour Virtual j'ai touvé ca sur developpez.net:
 
"Le mot-clé virtual permet de supplanter une fonction membre d'une classe parent depuis une classe dérivée (à condition qu'elle ait la même signature)."
 
je me demande alors pourquoi j'ai besoin d'un virtual devant void Affiche() const; (de ma classe Personne).
 
Ca ne suffirait pas de mettre le virtual uniquement dans Affiche() de la classe Employe ??

Reply

Marsh Posté le 24-01-2006 à 21:39:25    

nan justement, fo le specifier dans la classe pere

Reply

Marsh Posté le 24-01-2006 à 21:42:59    

et le destructeur virtuel ?

Reply

Marsh Posté le 25-01-2006 à 08:45:58    

fab++, comment fait on pour récupérer le nom, prenom et age de la personne dans la classe Employe ?
 
cf ton message http://forum.hardware.fr/hardwaref [...] m#t1291356


Message édité par slash33 le 25-01-2006 à 08:48:07
Reply

Marsh Posté le 25-01-2006 à 09:29:03    

bah tu fais des getter ;)
 

Code :
  1. AnsiString Personne::GetNom() const
  2. {
  3.         return this->nom;
  4. }


Message édité par le_duc le 25-01-2006 à 09:32:35
Reply

Marsh Posté le 25-01-2006 à 09:39:00    

chrisbk a écrit :

nan justement, fo le specifier dans la classe pere


 
mais alors on peut enlever le "virtual" de  

Code :
  1. virtual void Affiche() const;


de la classe Employe!
 
non?

Reply

Marsh Posté le 25-01-2006 à 09:42:31    

oui, tu peux. Mais en pratique ca fait pas de mal non plus et ca laisse courir l'info que Affiche est virtuelle

Reply

Marsh Posté le 25-01-2006 à 10:32:05    

okayyy

Reply

Marsh Posté le 25-01-2006 à 10:32:34    

qqn a une explication pour le "&" ?? je trouve pas


Message édité par le_duc le 25-01-2006 à 10:32:47
Reply

Marsh Posté le 25-01-2006 à 10:34:36    

?
 
ca signifie soit que tu prends l'adresse d'une variable (si dans une expression), soit que ton type est une reference vers qqchose (en declaration de variable / parametre)
 
cf cours C++

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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