Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/03/2020, à 19:25

chris7522

Saisie utilisateur C++

Bonjour ,

Je souhaiterai demander a mon utilisateur son nom , prenom , age . Je n'arrive pas a avoir de la documentation pour savoir comment m'y prendre . J'ai fait un truc , mais je suis completement a coté de la plaque :

header

#ifndef PERSONNE_HPP_
#define PERSONNE_HPP_

#include <string>
using namespace std;

class Personne
{
  private:
  string nom;
  string prenom;
  int age;

  public:
  Personne();
  void afficher();
  string get_nom();
  string get_prenom();
  int get_age();

  void set_nom(string x);
  void set_prenom(string x);
  void set_age(int x);

personne.cpp

#include "personne.hpp"
#include <iostream>
#include <string>
using namespace std;

void Personne::afficher()
{
	cout << "Nom: " << chris.get_nom()<< endl;
	cout << "prenom: " << chris.get_prenom() << endl;
	cout << "Age: " << chris.get_age() << endl;
}

string get_nom(){return nom;}
string get_prenom(){return prenom;}
int get_age(){return age;}

void set_nom(string x){this -> chris.set_nom = a;}
void set_prenom(string x);{this -> chris.set_prenom = b;}
void set_age(int x);{this -> chris.set_age = c;}

Et le fichier main , j'ose meme pas l'afficher tellement c'est pourri .
Merci de votre aide .

Hors ligne

#2 Le 06/03/2020, à 19:35

grigouille

Re : Saisie utilisateur C++

Tes fichiers ne sont pas complets.
Donne

cat personne.hpp

et

cat personne.cpp

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#3 Le 06/03/2020, à 19:35

NicoApi73

Re : Saisie utilisateur C++

Salut,
Donne tout stp.

Et explique quel problème tu rencontres?

Hors ligne

#4 Le 06/03/2020, à 20:58

chris7522

Re : Saisie utilisateur C++

Le cat personne.hpp :

#ifndef PERSONNE_HPP_
#define PERSONNE_HPP_

#include <string>
using namespace std;

class Personne
{
  private:
  string nom;
  string prenom;
  int age;

  public:
  Personne();
  void afficher();
  string get_nom();
  string get_prenom();
  int get_age();

  void set_nom(string x);
  void set_prenom(string x);
  void set_age(int x);

};

#endif /* PERSONNE_HPP_ */

et le cat personne.cpp

#include "personne.hpp"
#include <iostream>
#include <string>
using namespace std;

void Personne::afficher()
{
	cout << "Nom: " << chris.get_nom()<< endl;
	cout << "prenom: " << chris.get_prenom() << endl;
	cout << "Age: " << chris.get_age() << endl;
}

string get_nom(){return nom;}
string get_prenom(){return prenom;}
int get_age(){return age;}

void set_nom(string x){this -> chris.set_nom = a;}
void set_prenom(string x);{this -> chris.set_prenom = b;}
void set_age(int x);{this -> chris.set_age = c;}

Et pour le main , j'ai tenté ca :

#include "personne.hpp"
#include <iostream>
#include <string>
using namespace std;

int main()
{
 Personne chris;
 string a,b;
 int c;
 cout << "Entrez nom famille:" << endl;
 cin >> a;
 chris.set_nom(a);
 cin.ignore();
 cout << "Entrez prenom: " << endl;
 cin >>b;
 chris.set_prenom(b);
 cin.ignore();
 cout << "Entrez age: " << endl;
 cin >>c;
 chris.set_age(c);
 cin.ignore();

 chris.afficher();

 return 0;
}

Hors ligne

#5 Le 06/03/2020, à 21:30

lann

Re : Saisie utilisateur C++

Tu as un problème dans les fonctions set_xxx
Par exemple, pour set_nom, il faut faire ça :

void set_nom(string x){nom=x;}

Pour la fonction afficher :

void Personne::afficher()
{
	cout << "Nom: " << nom<< endl;
	cout << "prenom: " << prenom<< endl;
	cout << "Age: " << age << endl;
}

Dernière modification par lann (Le 06/03/2020, à 21:32)

Hors ligne

#6 Le 06/03/2020, à 22:33

chris7522

Re : Saisie utilisateur C++

Merci de ton aide . J'ai ceci a la compilation :

21:27:30 **** Incremental Build of configuration Debug for project essai2 ****
make all 
Building file: ../personne.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"personne.d" -MT"personne.o" -o "personne.o" "../personne.cpp"
../personne.cpp: In function ‘std::__cxx11::string get_nom()’:
../personne.cpp:13:25: error: ‘nom’ was not declared in this scope
 string get_nom(){return nom;}
                         ^~~
../personne.cpp: In function ‘std::__cxx11::string get_prenom()’:
../personne.cpp:14:28: error: ‘prenom’ was not declared in this scope
 string get_prenom(){return prenom;}
                            ^~~~~~
../personne.cpp:14:28: note: suggested alternative: ‘rename’
 string get_prenom(){return prenom;}
                            ^~~~~~
                            rename
../personne.cpp: In function ‘int get_age()’:
../personne.cpp:15:22: error: ‘age’ was not declared in this scope
 int get_age(){return age;}
                      ^~~
../personne.cpp: In function ‘void set_nom(std::__cxx11::string)’:
../personne.cpp:17:24: error: ‘nom’ was not declared in this scope
 void set_nom(string x){nom = x;}
                        ^~~
../personne.cpp: In function ‘void set_prenom(std::__cxx11::string)’:
../personne.cpp:18:27: error: ‘prenom’ was not declared in this scope
 void set_prenom(string x){prenom = x;}
                           ^~~~~~
../personne.cpp:18:27: note: suggested alternative: ‘rename’
 void set_prenom(string x){prenom = x;}
                           ^~~~~~
                           rename
../personne.cpp: In function ‘void set_age(int)’:
../personne.cpp:19:21: error: ‘age’ was not declared in this scope
 void set_age(int x){age = x;}
                     ^~~
subdir.mk:21: recipe for target 'personne.o' failed
make: *** [personne.o] Error 1
"make all" terminated with exit code 2. Build might be incomplete.

21:27:31 Build Failed. 8 errors, 0 warnings. (took 727ms)

Hors ligne

#7 Le 06/03/2020, à 22:37

grigouille

Re : Saisie utilisateur C++

Ton programme est bourré de fautes élémentaires. Je te suggère de retravailler les bases et de présenter un programme qui compile.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#8 Le 06/03/2020, à 22:59

chris7522

Re : Saisie utilisateur C++

Tu as raison , j'ai trop de lacunes .

Hors ligne

#9 Le 07/03/2020, à 01:50

NicoApi73

Re : Saisie utilisateur C++

Ne pars pas défaitiste.

Ton main.cpp compile et en plus il fait ce que tu souhaites. Ton header est correct. Par contre ton code dans personne.cpp est tout faux.

Le code d'une méthode est de la forme :

type_de_retour nom_classe::nom_methode (arguments)
{
code;
}

Par exemple :

void Personne::afficher()
{
// le code pour afficher
}

Les attributs sont accessibles directement, donc la méthode ci-dessus est :

void Personne::afficher()
{
	cout << "Nom: " << nom << endl;
	cout << "prenom: " << prenom << endl;
	cout << "Age: " << age << endl;
}

nom, prenom et age seront uniques à chaque instance de Personne (ou objet de type Personne) qui seront créés.

Le code du constructeur est du type :

nom_classe::nom_classe (arguments)
{
code;
}

Le constructeur sert au minimum à initialiser les attributs. Tu ne l'as pas codé et il faudrait que tu initialises au moins une de tes variables...

Dernière modification par NicoApi73 (Le 07/03/2020, à 01:52)

Hors ligne

#10 Le 07/03/2020, à 17:15

chris7522

Re : Saisie utilisateur C++

Bonjour ,
J'ai fais quelques changements mais il subsiste 2 erreurs

#ifndef PERSONNE_HPP_
#define PERSONNE_HPP_

#include <string>

class Personne
{
  private:
  std::string nom;
  std::string prenom;
  int age;

  public:
  Personne();
  void afficher();
  std::string get_nom();
  std::string get_prenom();
  int get_age();

  void set_nom(std::string a);
  void set_prenom(std::string b);
  void set_age(int c);

};

#endif /* PERSONNE_HPP_ */
#include "personne.h"
#include <iostream>
#include <string>
using namespace std;

string nom,prenom;
int age;

Personne::Personne()
{
	nom="";
	prenom="";
	age=48;
}

void Personne::afficher()
{
	cout << "Nom: " << nom << endl;
	cout << "prenom: " << prenom << endl;
	cout << "Age: " << age << endl;
}

string get_nom(){return nom;}
string get_prenom(){return prenom;}
int get_age(){return age;}

void set_nom(string a){nom = a;}
void set_prenom(string b){prenom = b;}
void set_age(int c){age = c;}
#include "personne.h"
#include <iostream>
#include <string>
using namespace std;

int main()
{
 Personne chris;
 string a,b;
 int c;
 cout << "Entrez nom famille:" << endl;
 cin >> a;
 chris.set_nom(a);
 cin.ignore();
 cout << "Entrez prenom: " << endl;
 cin >>b;
 chris.set_prenom(b);
 cin.ignore();
 cout << "Entrez age: " << endl;
 cin >>c;
 chris.set_age(c);
 cin.ignore();

 chris.afficher();

 return 0;
}

Et donc j'ai ces erreurs que je n'arrive pas a solutionner :

16:12:39 **** Incremental Build of configuration Debug for project personne ****
make all 
Building target: personne
Invoking: GCC C++ Linker
g++  -o "personne"  ./main.o ./personne.o   
./main.o : Dans la fonction « main » :
/home/chris/Projets_C++/personne/Debug/../main.cpp:13 : référence indéfinie vers « Personne::set_nom(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) »
/home/chris/Projets_C++/personne/Debug/../main.cpp:17 : référence indéfinie vers « Personne::set_prenom(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) »
/home/chris/Projets_C++/personne/Debug/../main.cpp:21 : référence indéfinie vers « Personne::set_age(int) »
makefile:44: recipe for target 'personne' failed
collect2: error: ld returned 1 exit status
make: *** [personne] Error 1
"make all" terminated with exit code 2. Build might be incomplete.

16:12:39 Build Failed. 2 errors, 0 warnings. (took 529ms)

Merci de votre aide

Hors ligne

#11 Le 07/03/2020, à 18:13

NicoApi73

Re : Saisie utilisateur C++

Bonjour,

Les erreurs sont ici :

string get_nom(){return nom;}
string get_prenom(){return prenom;}
int get_age(){return age;}

void set_nom(string a){nom = a;}
void set_prenom(string b){prenom = b;}
void set_age(int c){age = c;}

Formulé comme ça, tu codes 6 fonctions, qui ne sont pas déclarées ailleurs, et qui ne sont pas des méthodes de la classe Personne.
L'erreur apparaît au moment du link.

Pourquoi initialises-tu l'attribut âge à 48? Alors que tu as bien initialisé nom et prenom à ""...

Hors ligne

#12 Le 07/03/2020, à 19:11

chris7522

Re : Saisie utilisateur C++

Oui j'aurai du initialiser age = 0;

Hors ligne

#13 Le 07/03/2020, à 19:18

NicoApi73

Re : Saisie utilisateur C++

chris7522 a écrit :

Oui j'aurai du initialiser age = 0;

Pas nécessairement, tu pouvais également le mettre à -1, pour indiquer qu'il n'avait pas été initialisé avec l'assesseur.

De la même manière, tu pouvais créer un constructeur permettant d'initialiser tes attributs directement wink

Hors ligne

#14 Le 07/03/2020, à 20:00

NicoApi73

Re : Saisie utilisateur C++

As tu compris tes erreurs (en fait ton erreur répétée 6 fois)?

Hors ligne

#15 Le 07/03/2020, à 23:11

chris7522

Re : Saisie utilisateur C++

Franchement , j'ai du mal a savoir .
   Par contre je crois que j'aurai pas du redéclarer en global mes variables nom , prenom et age dans mon .cpp puisqu'elles sont des attributs de ma classe mais j'en suis pas sur .

Hors ligne

#16 Le 08/03/2020, à 00:31

NicoApi73

Re : Saisie utilisateur C++

chris7522 a écrit :

   Par contre je crois que j'aurai pas du redéclarer en global mes variables nom , prenom et age dans mon .cpp puisqu'elles sont des attributs de ma classe.

Surtout pas, c'est exactement l'inverse. Il faut respecter le principe d'encapsulation des données et accéder à celles-ci au travers des assesseurs.

Tu dois coder tes méthodes avec l'entête suivant :

type_de_retour nom_classe::nom_methode (arguments)
{
code;
}

Tu l'as fait pour ton constructeur et pour la méthode afficher. Pourquoi ne l'as tu pas fait pour les autres?

Pour toutes les méthodes en défaut, il leur manque la référence à la classe (nom_classe::)  Tu n'as besoin que de corriger ceci pour que ton code compile et soit exécutable.

Hors ligne

#17 Le 08/03/2020, à 04:48

chris7522

Re : Saisie utilisateur C++

Oh la la ,  le boulet ! je suis desesperant ! J'ai pas percuté pour quelque chose d'aussi elementaire .
   J'etais persuadué que pour le setter /getter , il n'y avait pas besoin de rajouter le nom de classe .
Merci de ta patience , c'est vraiment sympa de ta part ☺

Hors ligne

#18 Le 08/03/2020, à 09:49

NicoApi73

Re : Saisie utilisateur C++

Maintenant que tu as compris, quelque chose d'important :
Ne donne pas la responsabilité à ta classe personne l'affichage des informations. Cette classe gère les informations (nom, prénom et age) Crée une autre classe pour afficher.

Certes, dans l'exemple que tu as pris, il n'y a pas de problème, car ce n'est qu'un exemple, mais dans un projet plus complexe, tu vas mélanger des responsabilités et rapidement tu vas te trouver avec quelque chose qui ne sera pas maintenable et que tu ne pourras pas faire évoluer sans tout reprendre. Pour structurer ton code, regarde ce qu'est le principe d'encapsulation des donnée (https://fr.wikipedia.org/wiki/Encapsula … rammation)), la cohésion (https://fr.wikipedia.org/wiki/Coh%C3%A9 … ormatique)) et le couplage https://fr.wikipedia.org/wiki/Couplage_(informatique))

Imaginons que tu continues ton exemple en ajoutant une classe maison, une classe objet (que tu peux surcharger pour la spécialiser)... Si à un moment tu veux changer l'affichage, il faut que tu ailles modifier toutes tes classes, alors que si tu en as une dédiée, l'impact sera beaucoup plus limité!

Hors ligne

#19 Le 08/03/2020, à 16:02

chris7522

Re : Saisie utilisateur C++

Merci une nouvelle fois .
     Je me permet de revenir sur la declaration de mes variables prenom, nom et age en global dans le .cppp . N'est ce pas inutile ? Je les ai retirer de mon .cpp et ca fonctionne egalement .
      Si j' initialise ma méthode de cette facon , est ce mieux que prédemment (guillemets) ou cela n'a pas d'importance ?

Personne::Personne()
{
	nom = {};
	prenom = {};
	age= {};
}
 

Pour mes méthodes getter , puis je les rendre constante ?
De meme pour mes méthodes setter , puis je rendre mes parametres constant ?

Dernière modification par chris7522 (Le 08/03/2020, à 16:20)

Hors ligne

#20 Le 08/03/2020, à 17:02

NicoApi73

Re : Saisie utilisateur C++

chris7522 a écrit :

     Je me permet de revenir sur la declaration de mes variables prenom, nom et age en global dans le .cppp . N'est ce pas inutile ? Je les ai retirer de mon .cpp et ca fonctionne egalement .

Je ne comprends pas. Tu as des attributs déclarés dans ta classe. Tu y accèdes par les assesseurs. Il n'y a pas de notion de variables globales. De toutes façons, les variables globales violent le principe d'encapsulation des données. Tu n'en as besoin que dans des cas très rares. (et pour l'instant tu n'y es pas confronté.)

chris7522 a écrit :

      Si j' initialise ma méthode de cette facon , est ce mieux que prédemment (guillemets) ou cela n'a pas d'importance ?

Personne::Personne()
{
	nom = {};
	prenom = {};
	age= {};
}
 

C'est une autre manière d'initialiser les données. Inutile pour nom et prenom. (tout comme les guillemets).

chris7522 a écrit :

Pour mes méthodes getter , puis je les rendre constante ?
De meme pour mes méthodes setter , puis je rendre mes parametres constant ?

Je ne comprends pas ta remarque pour les getters. Tu ne peux pas affecter une valeur à une constante en dehors de l'initialisation.

Pour les setters, tu peux faire dans le header :

  void set_nom(const std::string a);
  void set_prenom(const std::string b);
  void set_age(const int c);

et dans le code :

void Personne::set_nom(const string a){nom = a;}
void Personne::set_prenom(const string b){prenom = b;}
void Personne::set_age(const int c){age = c;}

Ca reste d'un intérêt limité puisque tu ne les passes pas par référence.

Hors ligne