IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Visibilité entre instances, les fonctions amies


Sujet :

C++

  1. #1
    Membre du Club Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 49
    Points
    49
    Par défaut Visibilité entre instances, les fonctions amies
    Bonjour,
    tout d'abord voici mon programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
     
     
    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
     
    #define LONG_COMENT 100	//pour la longueur du commentaire
    #define LONGNOM 50
    #define NB_MAT 5	// nombre de matières maximum suivies par l'étudiant
     
    using namespace std;
     
    int un_nombre, i, ctt, htt;
    char n,p;
     
    char*_nom_enseig;
    char*_nom_eleve; 
    char*_commentaire;
     
     
    //*******************************
    //CLASSE PERSONNE
    //*******************************
     
    class Personne{
     
    protected:
     
    char *nom[LONGNOM];
    char *prenom[LONGNOM];
    int age;
     
    class Personne *p;
     
    public:	Personne();		//Constructeurs
    		Personne(char*, char*, int);
    		~Personne();	//Destructeur
     
    		void affiche_nom();
    		void affiche_prenom();
    		void affiche_age();
    		void modif_nom(char *);
    		void modif_prenom(char *);
    		void modif_age(int);
    		void print();
     
    };
     
    /*CONSTRUCTEURS*/
     
    /************/
    Personne::Personne(char* nom, char* prenom, int age) {
     
    cout<<" CREATION D'UNE FICHE 'PERSONNE' ----> "<<endl;
    cout<<"-------------------------------"<<endl;
    cout<<endl;
     
    cout<<"Nom: "<<nom<<endl;
    cout<<"Prenom: "<<prenom<<endl; 
    cout<<"Age: "<<age<<endl;
    cout<<endl;
    }
     
    /*DESTRUCTEUR*/
    Personne::~Personne(){
    delete(p);
    }
     
    //Fonction affiche nom
    void Personne::affiche_nom(){
    	cout<<"Nom: "<<Personne::nom<<endl;
    	}
    //Fonction affiche prenom
    void Personne::affiche_prenom(){
    	cout<<"Prenom: "<<Personne::prenom<<endl;
    	}
     
    //Fonction affiche age
    void Personne::affiche_age(){
    	cout<<"Age: "<<Personne::age<<endl;
    	}
     
     
    //Fonction modif_nom
    void Personne::modif_nom(char *n){
    cout<<"Modification du nom: "<<endl;
    cin>>Personne::nom[LONGNOM];	
    }
     
     
    //Fonction modif_prenom
    void Personne::modif_prenom(char *n){
    cout<<"Modification du prenom: "<<endl;
    cin>>Personne::prenom[LONGNOM];
    }
     
    //Fonction modif_age
    void Personne::modif_age(int a){
    cout<<"Modification de l'age: "<<endl;
    cin>>Personne::age;
    }
     
    //Fonction Print
     
    void Personne::print() {
    Personne::affiche_nom();
    Personne::affiche_prenom();
    Personne::affiche_age(); cout<<" ans ";
    }
     
     
    //*********************************
    //CLASSE ETUDIANT
    //*********************************
     
    class Etudiant : public Personne{
     
    protected: 
     
    char matières_suivi[NB_MAT][LONGNOM]; //liste de matières suivies par l'élève
    int notes[20]; //liste de notes de l'élève
     
    class Etudiant *p;
     
     
    public:	Etudiant();
    		Etudiant(char* , char*, int, char*);
    		~Etudiant();
     
    		void affiche_matières();
    		void get_note(int);	
    		int Moyenne(int);
    		void print();
    };
     
    /*CONSTRUCTEURS*/
    /************/
     
    Etudiant::Etudiant(char* nom, char* prenom, int age, char *matières_suivi) : Personne(nom, prenom, age){
     
    cout<<" CREATION D'UNE FICHE 'ELEVE' --->"<<endl;
    cout<<"------------------------- ---"<<endl;
    cout<<endl;
     
    cout<<"Nom de l'etudiant: "<<nom<<endl;
    cout<<"Prenom: "<<prenom<<endl; 
    cout<<"Age: "<<age<<endl;
    cout<<"Matieres suivies: "<<matières_suivi<<endl;
    cout<<endl;
    }
     
    /*DESTRUCTEUR*/
    Etudiant::~Etudiant(){
    delete(p);
    }
     
     
    //Fonction affiche_matières
    void Etudiant::affiche_matières(){
    	cout<<"Liste des matieres suivies par l'Etudiant: "<<endl;
    	cout<<Etudiant::matières_suivi;
    	cout<<endl;
    }
     
    //Fonction getin_note: pour affecter une note à l'élève
    void Etudiant::get_note(int){
     
    cout<<"Affectation de notes à l'etudiant: "<<endl;
    	cout<<"---------------------------------------------"<<endl;
     
    	cout<<"Combien de notes voulez vous ajouter à la fiche de cet etudiant?"<<endl;
    	cin>>un_nombre;
     
    	for(i=0; i<un_nombre; i++) {
    		cout<<"Entrez une note: "<<endl;
    		cin>>Etudiant::notes[i];
    	}
    }
     
     
    //Fontion Moyenne: pour calculer la moyenne des notes de l'étudiant
    int Etudiant::Moyenne(int){
     
    int nb_note;
    int moy=0;
     
    cout<<"De combien de notes cet élève dispose-t-il? "<<endl;
    cin>>nb_note;
     
    for(i=0; i<nb_note; i++){
    	moy= moy + Etudiant::notes[i];
    }
     
    moy= moy/nb_note;
     
    return moy;
    }
     
     
    //Fonction Print
     
    void Etudiant::print(){
     
    Etudiant::affiche_nom();
    Etudiant::affiche_prenom();
    Etudiant::affiche_age(); cout<<" ans "<<endl;
    cout<<"Matiere(s) suivie(s) "<<matières_suivi<<endl;
    }
     
     
     
     
    //***********************************
    //CLASSE ENSEIGNANT
    //***********************************
     
    class Enseignant : public Personne{
     
    protected: 
     
    char matières_enseig[NB_MAT][LONGNOM]; //liste de matières enseignées
    int tarif;
     
    class Enseignant *p;
     
    public:	Enseignant();
    		Enseignant(char*, char*, int, char*, int);
    		~Enseignant();
     
    		void affich_matières();
    		void heure_tt(int);
    		void coût(int);
    		void print();
    		void affiche_commentaire();
    		void saisie_commentaire(char *);
     
    };
     
    /*CONSTRUCTEURS*/
    /************/
    Enseignant::Enseignant(char* nom, char* prenom, int age, char *matières_enseig, int tarif) : Personne(nom, prenom, age){
     
    	cout<<" CREATION D'UNE FICHE ENSEIGNANT ---->"<<endl;
    	cout<<"---------------------------------"<<endl;
    	cout<<endl;
     
    	cout<<"Nom de l'enseignant: "<<nom<<endl;
    	cout<<"Prenom: "<<prenom<<endl; 
    	cout<<"Age: " <<age<<endl; 
    	cout<<"Matiere enseignees: "<<matières_enseig<<endl;
    	cout<<"Tarif Horaire: "<<tarif<<" euros."<<endl;
    	cout<<endl;    
    }
     
    /*DESTRUCTEUR*/
    Enseignant::~Enseignant(){
    delete(p);
    }
     
     
     
    //Fonction affiche_matières
    void Enseignant::affich_matières(){
    	std::cout<<"Liste des matieres enseignees par ce professeur: "<<endl;
    	std::cout<<Enseignant::matières_enseig;
    	std::cout<<endl;
    }
     
    //Fonction heure_tt: pour le calcul des heures totales
    void Enseignant::heure_tt(int){
    int nb_dh;
    int x=1;
    htt=0;
     
    cout<<"Saisie du nombre d'heures enseignees par matieres:"<<endl;
    cout<<"--------------------------------------------------"<<endl;
     
    for(i=0; i<5; i++){
    	cout<<"Veuillez saisir le nombre d'heures totales enseigné pour matiere "<<x<<": "<<endl;
    	cin>>nb_dh;
     
    htt=htt+nb_dh;
     
    x++;
    }
     
    cout<<"Total des heures: "<<endl;
    cout<<htt<<endl;
    cout<<endl;
    }
     
     
    //Fonction coût: pour le calcul du cout total de l'enseignant
    void Enseignant::coût(int){
    ctt=0;
     
    ctt= htt*tarif;
     
    cout<<"Coût total de l'enseignant: "<<endl;
    cout<<ctt;
    }
     
    //Fonction Print
     
    void Enseignant::print(){
     
    Enseignant::affiche_nom();
    Enseignant::affiche_prenom();
    Enseignant::affiche_age(); cout<<" ans "<<endl;
    cout<<"enseigne les matieres suivantes: "<<matières_enseig<<endl;
    cout<<"Pour un tarif horaire de "<<tarif<<endl;
    }
     
    //Fonction saisie commentaire:
    void Enseignant::saisie_commentaire(char *_commentaire){
     
    	cout<<"BIENVENUE DANS LA FONCTION D'ATTRIBUTION DE COMMENTAIRES"<<endl;
    	cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
     
    	cout<<"Saisissez le commentaire: "<<endl;
    	cin>>_commentaire;
    	cout<<endl;
     
    }
     
    //Fonction affiche_commentaire
    void Enseignant::affiche_commentaire(){
     
    cout<<_commentaire<<endl;
    cout<<endl;
    }
     
     
    //*******************
    //CLASSE APPRECIATION
    //*******************
     
    class Appreciation {
     
    protected:
     
     
     
    friend void Enseignant::affiche_commentaire();
    friend void Enseignant::saisie_commentaire(char *);
     
    public:		Appreciation(char* ,char*, char*);
    			~Appreciation();
     
    };
     
    //Constructeurs
    //*************
     
    Appreciation::Appreciation(char *nom_enseig, char *nom_eleve, char *commentaire){
     
    nom_enseig = new char [strlen(_nom_enseig) + 1];
     
    nom_eleve = new char [strlen(_nom_eleve) + 1];  
     
    commentaire = new char [strlen(_commentaire) + 1];
     
     
     
     
    }
     
    //Destructeur
    //***********
    Appreciation::~Appreciation(){
    delete[]_nom_enseig;
    delete[]_nom_eleve;
    delete[]_commentaire;
    }
     
     
     
     
    //***********************
    //EXECUTION DU PROGRAMME:
    //***********************
     
    void main(){
     
    char c[LONG_COMENT];
     
    //Creation d'un enseignant
    Enseignant _ens("France", "Haie", 40, "Francais et Education Civique", 11);
     
    //Creation d'un etudiant
    Etudiant _etu("Lulu", "Turlututu", 17, "Francais");	
     
    cout<<endl;
     
    //Creation du commentaire
    _ens.saisie_commentaire(c);
     
    //Affichage du commentaire
     
    cout<<"Resume du commentaire = "<<endl;
    cout<<"---------------------"<<endl;
    cout<<endl;
     
    cout<<"Etudiant: ";
    _etu.print();
     
    cout<<"Commentaire fait par le professeur: "<<endl;
    _ens.affiche_nom();
    _ens.affiche_prenom();
    cout<<endl;
     
    cout<<"Commentaire => "<<endl;
    _ens.affiche_commentaire();
    cout<<endl;
    cout<<endl;
     
     
    //FIN DU PROGRAMME
    getchar();
    }
    Mon problème est simple mais compliqué a la fois ...
    En fait, quand je compile, no problème, aucune erreur (après, la configuration est peut etre mauvaise mais si c'est ca alors c'est tout une autre histoire...)
    Par contre quand j'execute:
    Tout se passe bien jusqu'à ce que le programme me demande de rentrer le commentaire: une fois le commentaire entré, la suite du programme s'execute mais pas comme il le devrait! Tout d'abord il note une erreur d'execution mais ensuite le résumé du commentaire n'affiche pas les données mais des chiffres
    Je n'arrive pas a trouver mon (ou mes) erreur !!
    Cela fait trop longtemps que je suis sur ce programme je n'en peux plus!
    Sachez que je suis débutante ^^
    Quelqu'un pourrait il m'aider ?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Désolé, mais il y a tellement de choses qui ne vont pas que je ne peux que te conseiller de débuter par un cours de C++.

    Dans le désordre:
    -> Pourquoi tout le code est dans le même fichier?
    -> Pourquoi as-tu des variables globales?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Personne{
     
    protected:
     
    char *nom[LONGNOM];
    char *prenom[LONGNOM];
    Pourquoi un tableau de pointeur sur des char? Voulais-tu une chaîne de caractère (cf std::string).

    Tu veux un singleton? Si tu ne comprend pas la question, pourquoi as-tu écrit cette ligne?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Personne::Personne(char* nom, char* prenom, int age) {
    Comprends-tu ce qui se passe entre nom/prenom/age en paramètre et nom/prenom/age de la classe?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Personne::~Personne(){
    delete(p);
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void Personne::affiche_nom(){
    	cout<<"Nom: "<<Personne::nom<<endl;
    	}


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Personne::modif_nom(char *n){
    cout<<"Modification du nom: "<<endl;
    cin>>Personne::nom[LONGNOM];	
    }


    Comprends-tu ce qui se passe entre Etudiant::p et Personne::p?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    nt Etudiant::Moyenne(int){
     
    int nb_note;
    int moy=0;
     
    cout<<"De combien de notes cet élève dispose-t-il? "<<endl;
    cin>>nb_note;
     
    for(i=0; i<nb_note; i++){
    	moy= moy + Etudiant::notes[i];
    }
     
    moy= moy/nb_note;
     
    return moy;
    }


    Ben, j'vais faire l'enseignant: je vais pas plus loin car là c'est déjà la catastrophe!

  3. #3
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    De loin sans tester ni rien, je dirais que certainement que ton problème viens de la gestion des char* que tu utilises (si je ne me trompe pas) comme si ils copiaient leur contenu aussi, ce qui n'est pas le cas.

    Pour l'instant je vais m'en tenir uniquement a un conseil qui permettra a ton code d'être plus clair, plus sûr et certainement correct : Utilise std::string plutot que des char* pour stocker/manipuler du texte/string.


    Là je suis en train d'esssayer de revoir ton code pour le faire tourner, mais je remarque déjà que dans le constructeur de Persone tu ne fais pas l'initialisation des variables membre et du coup tu perds les infos...


    edit> grillé XD

  4. #4
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Bonjour,

    Tout d'abord, essaie d'ordonner un peu mieux ton code :
    - indente-le correctement
    - écris chaque définition de classe dans son .h (un .h par classe), les implémentations des fonctions membres de chaque classe dans son .cpp (un .cpp par classe) et le main dans un .cpp à lui
    - n'écris pas de nom avec des accents (quel est le compilateur qui te laisse faire une chose pareille ??)

    Pour la suite, j'ai besoin de savoir si ce programme est un exercice ou non.


    EDIT: Franchement, vous le faîtes exprès, non ? C'est un complot contre moi, c'est ça ?
    Grmbll.

  5. #5
    Membre du Club Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 49
    Points
    49
    Par défaut
    Non ce n'est pas un exercice.
    A la base oui mais moi je le fait pour le "plaisir".

    Mon compilateur c'est Visual Studio et le problème n'est pas l'ordre de mon code..

    Moi je m'y repère très bien comme ça, et de plus on ne m'a pas appris a écrire chaque définition de classe dans un fichier ..
    De plus je ne pense pas que ce soit si "catastrophique" puisque le compilateur ne trouve aucune erreur.
    Ce n'est peut être pas du super code de pro, bien organisé, avec des utilisation de professionnel bac+5, mais tant mieux puisque je ne suis pas une pro justement!
    Ici tout doit être parfait mais excusez moi dont de ne pas l'être.


  6. #6
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Si je te suggère d'organiser ton code, c'est pour qu'il soit plus lisible par les autres (en l'occurrence nous, qui essayons de répondre à ta question). Ça te servira plus tard à toi aussi, si un jour tu décides de jeter un œil à un de tes anciens codes.

    Tu n'as pas de raison d'être susceptible, on essaie seulement de t'aider. En aucun cas on ne juge.
    On a tous été débutant et on a tous commencé par écrire du code pire que tout.

  7. #7
    Membre du Club Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 49
    Points
    49
    Par défaut
    Dans ce cas il faut vite envoyer le président d'Educatel en prison, car j'ai eu beaucoup de très bonne note pour ce genre de code écrit ainsi.
    En gros, je fais une formation qui me servira a rien, puisque au final je sortirais de la avec une nouvelle version du C++ : le C++ illisible et inutilisable dans le monde du travail.
    Youpi

  8. #8
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Je ne connais pas du tout Éducatel… j'ai fait une recherche rapidement et suis tombé sur une page d'appréciation de cette formation : http://www.ciao.fr/Avis/Educatel__8521
    Ça semble plutôt critiqué… Peut-être pourrais-tu en discuter dans un forum plus approprié, qui sera davantage apte à t'aider sur ce point ?

    Tout ce qu'on peut faire ici, c'est t'aider à améliorer les bouts de code que tu nous présentes. Certains membres du forum sont plutôt très compétents. Tous contribuent gratuitement à cette entraide et s'évertuent à donner les meilleurs conseils possibles.
    C'est ni plus ni moins ce qu'on vient de faire ici, dans ton topic. Si tu penses tout comme moi que tu as besoin de progresser, alors fais comme moi, écoute les conseils des autres, mêmes s'ils semblent un peu durs.

  9. #9
    Membre du Club Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 49
    Points
    49
    Par défaut
    Effectivement je viens de lire les avis sur educatel et ça donne vraiment envie de continuer (ironie) ....
    J'avais déjà lu des choses dans ce genre (mon dieu mais qu'est ce que je fou là!)

    Bon eh bien ... on va travailler là deçu ..


  10. #10
    Membre confirmé

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Points : 527
    Points
    527
    Par défaut
    Pas de panique. Pour du code de débutant, c'est plutôt très bon, avec un souci de lisibilité typographique de bon augure pour le stade où les fondamentaux sont maitrisés.
    Comme dit ci-dessus, les problèmes viennent essentiellement de l'incompréhension (classique) des pointeurs, ce qui est gênant quand on les utilise pour les chaines de caractères et les tableaux. Les std::string (chaines de caractères) et std::vector (tableaux) devraient masquer ces soucis. En gros, quand on débute, tout tableau ou pointeur devrait être traité comme un drapeau rouge, et précisément la librairie standard permet d'éviter complètement ces héritages du C.

    Quelques oublis plus embêtants peuvent être attribués à l'organisation du code: par exemple le constructeur ne stocke pas ses arguments (indépendamment des pointeurs et ... tableaux de pointeurs au lieu de tableaux ). Il est probable que si vous aviez découpé votre fichier avec des classes, l'indépendance entre la classe Personne et l'application aurait été plus évidente, et donc vous n'auriez pas mélangé des instructions liées au programme principal (cout <<...) avec les instructions liées à la fonction même du constructeur (création d'un objet fonctionnel). Même si vous penser que vous vous y retrouvez, réfléchissez à cet exemple précis de votre code: pourquoi y a-t-il des écritures sur la sortie standard dans une classe, qui devrait être pensée comme utilisable pour tout autre chose que le programme principal en train d'être écrit? La décomposition en différents fichiers peut être considérée comme une sorte d'aide rappelant le contexte d'écriture.

    En tout cas, bon courage, et ne vous chagrinez pas des réactions de forums. Peut-être devriez vous commencer dans le sous-forum Débuter ?

  11. #11
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    à mon avis dans le cas où tu es rien ne vaut un bon livre écrit et à jour, en plus vu qu'il n'y a pas tellement de choses à modifier (je veux dire que c'est surtout des répétitions de la même erreur), tu pourras certainement corriger ton code très vite.

    Un exemple avec la classe personne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class Personne{
        protected:
     
            char *nom[LONGNOM];
            char *prenom[LONGNOM];
            int age;
     
            class Personne *p;
     
        public:
            Personne();		//Constructeurs
    		Personne(char*, char*, int);
    		~Personne();	//Destructeur
     
    		void affiche_nom();
    		void affiche_prenom();
    		void affiche_age();
    		void modif_nom(char *);
    		void modif_prenom(char *);
    		void modif_age(int);
    		void print();
     
    };
    Les variables nom et prenom sont des pointeurs vers des tableaux de chaines de caractères, je pense que tu as seulement besoin de tableaux de caractères.

    De plus, ça ne sert à rien de redéclarer la classe Personne dans la classe Personne!

    Ca ferait donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class Personne{
        protected:
     
            char nom[LONGNOM];
            char prenom[LONGNOM];
            int age;
        public:
                    Personne();		//Constructeurs
    		Personne(char*, char*, int);
    		~Personne();	//Destructeur
     
    		void affiche_nom();
    		void affiche_prenom();
    		void affiche_age();
    		void modif_nom(char *);
    		void modif_prenom(char *);
    		void modif_age(int);
    		void print();
     
    };
    Ensuite au niveau des constructeurs:

    Si tu fais un constructeur avec deux char * et un int en paramètre, logiquement il devrait modifier les variables de la classe en prenant ces valeurs.

    C'est à dire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Personne::Personne(char* nom, char* prenom, int age) 
    {
        modif_nom(nom);
        modif_prenom(prenom);
        modif_age(age);
        cout<<" CREATION D'UNE FICHE 'PERSONNE' ----> "<<endl;
        cout<<"-------------------------------"<<endl;
        cout<<endl;
     
        cout<<"Nom: "<<nom<<endl;
        cout<<"Prenom: "<<prenom<<endl;
        cout<<"Age: "<<age<<endl;
        cout<<endl;
    }
    Il n'y a pas non plus l'implémentation du constructeur par défaut.
    Pour n'utiliser qu'un seul constructeur, tu pourrais faire dans la classe de base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public:
                    //Constructeurs
    		Personne(char*nom=NULL, char*prenom=NULL, int age=0);
    		~Personne();	//Destructeur
    Comme ça, si les paramètres ne sont pas spécifiés, il prennent les valeurs par défaut données.

    Pour le destructeur, vu qu'on a enlevé le membre "class Personne *p" de la classe, ça devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Personne::~Personne()
    {
    }
    Pour les fonctions d'affichage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Fonction affiche nom
    void Personne::affiche_nom(){
    	cout<<"Nom: "<<Personne::nom<<endl;
    	}
    //Fonction affiche prenom
    void Personne::affiche_prenom(){
    	cout<<"Prenom: "<<Personne::prenom<<endl;
    	}
     
    //Fonction affiche age
    void Personne::affiche_age(){
    	cout<<"Age: "<<Personne::age<<endl;
    	}
    Utiliser Personne::variable est très lourd, des fois c'est nécessaire dans des cas complexes mais ici tu peux simplement faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Fonction affiche nom
    void Personne::affiche_nom(){
    	cout<<"Nom: "<< nom<<endl;
    	}
    //Fonction affiche prenom
    void Personne::affiche_prenom(){
    	cout<<"Prenom: "<< prenom<<endl;
    	}
     
    //Fonction affiche age
    void Personne::affiche_age(){
    	cout<<"Age: "<< age<<endl;
    	}
    Les fonctions modifier prennent un paramètre, c'est celui-là qui devrait être utilisé pour modifier les variables:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //Fonction modif_nom
    void Personne::modif_nom(char *n){
    cout<<"Modification du nom: "<<endl;
    cin>>Personne::nom[LONGNOM];
    }
     
     
    //Fonction modif_prenom
    void Personne::modif_prenom(char *n){
    cout<<"Modification du prenom: "<<endl;
    cin>>Personne::prenom[LONGNOM];
    }
     
    //Fonction modif_age
    void Personne::modif_age(int a){
    cout<<"Modification de l'age: "<<endl;
    cin>>Personne::age;
    }
    deviendrait donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //Fonction modif_nom
    void Personne::modif_nom(char *n){
        strcpy(nom, n);
    }
     
     
    //Fonction modif_prenom
    void Personne::modif_prenom(char *n){
        strcpy(prenom, n);
    }
     
    //Fonction modif_age
    void Personne::modif_age(int a){
        age = a;
    }
    Si tu veux changer les variables par saisie clavier, il vaudrait mieux appeler tes fonctions saisir_nom(), saisir_prenom() et saisir_age(), sans mettre aucun paramètre dans la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //Fonction saisir_nom
    void Personne::saisir_nom(){
    cout<<"Modification du nom: "<<endl;
    cin>>nom;
    }
     
     
    //Fonction saisir_prenom
    void Personne::saisir_prenom(){
    cout<<"Modification du prenom: "<<endl;
    cin>>prenom;
    }
     
    //Fonction saisir_age
    void Personne::saisir_age(){
    cout<<"Modification de l'age: "<<endl;
    cin>>age;
    }
    Enfin, si tu as des problèmes avec ton programme, essaie de tester chaque fonction. Par exemple tu aurais vu que tes fonctions modif_nom et modif_prenom ne marchaient pas du tout.



    Bref, si tu prends un livre (récent), tu verras du code vraiment bien écrit et tout auquel tu pourras te référer, et les concepts abordés au début du livre seront vraisemblablement différents de ceux abordés par ton cours éducatel.

    Bonne chance pour la suite.

  12. #12
    Membre du Club Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 49
    Points
    49
    Par défaut
    Merci beaucoup pour ces conseils, je vais modifier tout ca aujourd'hui et vous donnerais des nouvelles du code juste après !
    Merci encore!

  13. #13
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Super ! Bon courage

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    D'abord accepte mes excuses si nos réponses t'ont semblées agressives. Ce n'était pas le but. Mais apprends aussi à recevoir des critiques sur ton travail. Sache que dans certaines entreprises, il existe des processus de revue de code. Des pairs relisent le code et le critique, même celui produit par les cadors de 20 ans d'expérience. Cela permet de détecter des problèmes en avance de phase. Et, parfois, cela permet aussi au développeur d'apprendre (toujours valable pour le gus de 20 ans d'expérience).

    Je pense quand même que tu devrais potasser encore un peu quelques cours (il y en a dans le forum) au vu du code que tu nous as soumis.

    Commence par faire quelque chose de simple: ta classe Personne avec ses trois attributs (nom, prénom et age), un constructeur, un destructeur et un accésseur pour ces attributs. Puisque tu débutes, commence par utiliser des std::string. C'est un bon réflexe.
    Ensuite, fait ton main dans lequel tu déclare une instance de ta classe, tu lui renseigne ces attributs et tu les affiche.
    Apprend à découper ton code en plusieurs fichiers (.h, .cpp). C'est aussi une bonne pratique pour la suite, c'est même indispensable dès que tu travailles sur des projets plus conséquents.
    Soumets ce code simple pour commentaire dans ce forum.
    Ensuite passes à la seconde étape, les classes Etudiant et Enseignant qui dérivent de Personne.
    Enfin, finalise avec ta classe Appreciation et ton main.
    Souvent découper un problème et le vérifier à chaque étape permet aussi de se clarifier les idées.

    Je pense que tu étais parti avec beaucoup d'enthousiasme. Garde ce feu.
    Bon courage.

  15. #15
    Membre du Club Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 49
    Points
    49
    Par défaut
    Me revoici avec un problème.

    J'ai essayé de classer mes class, et tout d'abord une, pour commencer,
    la classe personne, en tant que fichier d'en-tête.

    Je fais donc mon couper-coller dans ce nouveau fichier d'en-tete, en modifiant certaines choses pour que ça marche bref tout est OK seulement dans mon fichier principal lorsque je :

    Erreur:

    Impossible d'ouvrir le fichier include*: 'personne.h'*: No such file or directory


    C'est pourtant bien comme ça que je doit faire non ?
    Je ne comprend pas pourquoi ça ne marche pas, mon fichier d'en-tete s'appel bien "personne.h" pourtant ...

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    <> est réservé aux includes standard (plus ou moins).
    Tu dois utiliser des "" à la place.

  17. #17
    Membre du Club Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 49
    Points
    49
    Par défaut
    oooouuuh ça marche merci !!!


  18. #18
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Non, il faut faire comme ça :
    Ca cherchera "personne.h" dans le répertoire courant.

    Si tu mets <personne.h>, ça cherchera un fichier "personne.h" dans le répertoire "include" de ton compilateur, ce qu'il ne trouvera probablement pas.

  19. #19
    Membre du Club Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 49
    Points
    49
    Par défaut
    Je crois que j'ai une erreur de paramètrage quelque part puisque maintenant que j'ai mit chacune de mes classes dans un fichier .h, une tonnes d'erreurs sur le fichier personne.h me tombe dessus...

    J'explique en gros, mon compilateur me dit que :

    dans le fichier "personne.h",

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void affiche_nom();
    		void affiche_prenom();
    		void affiche_age();
    		void saisir_nom();
    		void saisir_prenom();
    		void saisir_age();
    		void print();


    sont déjà définit dans 8c++, c'est a dire mon fichier principal avec ma fonction main ....

    Il n'y a rien de définit dans 8c++ , du moins rien de tout ça, alors je ne comprend pas ce qu'il me raconte là..

    D'ailleurs le compilateur en est tellement perturbé qu'il n'écrit apparemment pas toutes les erreurs car une Fatal error intervient (je suppose donc que les erreurs ne doivent pas s'arréter là...)

    Ceci est - il bien dut a une erreur de paramètrage ou une erreur de ma part tout court?
    Peut etre que je devrais songer à changer de compilateur aussi d'ailleurs ....
    (Merci Educatel)

  20. #20
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Quel est ton compilo ?

    Sinon, c'est peut-être une erreur d'oubli des "include guards".
    Je te renvoie pour cela à la FAQ : http://cpp.developpez.com/faq/cpp/?p...ASS_header_cpp

Discussions similaires

  1. Decalage, Probleme d'ordre d'entrée dans les fonctions
    Par clouddd dans le forum Débuter
    Réponses: 2
    Dernier message: 25/04/2010, 22h15
  2. Les fonctions amies.
    Par white_fire dans le forum Qt
    Réponses: 3
    Dernier message: 01/04/2009, 21h00
  3. Réponses: 2
    Dernier message: 25/10/2007, 13h56
  4. Comparaison entre les classes et les fonctions
    Par Ashgenesis dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 08/09/2005, 19h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo