Programmation en C++
Fermé
Jeking
Messages postés
5
Date d'inscription
jeudi 11 juin 2009
Statut
Membre
Dernière intervention
16 juin 2009
-
11 juin 2009 à 21:22
mamiemando Messages postés 33473 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 21 janvier 2025 - 14 juin 2009 à 18:54
mamiemando Messages postés 33473 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 21 janvier 2025 - 14 juin 2009 à 18:54
A voir également:
- Programmation en C++
- Application de programmation - Guide
- Mettre en veille un programme - Guide
- Programmation logo tortue télécharger - Télécharger - Études & Formations
- Programmation télécommande porte de garage brico depot - Forum Matériel & Système
9 réponses
etoile-du-net
Messages postés
102
Date d'inscription
mardi 28 août 2007
Statut
Membre
Dernière intervention
11 juin 2009
11
11 juin 2009 à 21:26
11 juin 2009 à 21:26
Bonjour ,
Cherche ici
https://openclassrooms.com/fr/courses/1894236-programmez-avec-le-langage-c
Tu y trouveras surement ton bonheur .
Bonne chance !
Cherche ici
https://openclassrooms.com/fr/courses/1894236-programmez-avec-le-langage-c
Tu y trouveras surement ton bonheur .
Bonne chance !
Bonjour,
Déjà quelle est ta question ?
Ensuite 2 choses :
1) Sépares la définition des éléments de ta classe de la déclaration de celle-ci, c'est plus lisible.
2) Ton constructeur est déclaré mais pas défini.
Déjà quelle est ta question ?
Ensuite 2 choses :
1) Sépares la définition des éléments de ta classe de la déclaration de celle-ci, c'est plus lisible.
2) Ton constructeur est déclaré mais pas défini.
mamiemando
Messages postés
33473
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
21 janvier 2025
7 815
12 juin 2009 à 01:12
12 juin 2009 à 01:12
1) Bon déjà, pas de using namespace std dans un .hpp. Ici ça va encore parce que tu n'as qu'un fichier et dans un cpp, mais à terme tu es sensé écrire un fichier Personne.hpp et Personne.cpp. Je te rappelle que le but d'un namespace est d'éviter des collisions de noms. Tant que tu es dans un cpp, pas de soucis car il n'est pas sensé être inclu par un autre fichier donc il ne risque pas de "contaminer" d'autres sections de code. Par contre si ce code était dans Personne.hpp ce ne serait pas le cas.. Et du coup des ambiguïtés pourraient apparaître. Pour plus de détails regarde à quoi sert un namespace sur un tutoriel C++. Du coup toutes les classes et constantes de la STL doivent être précédées d'un std::.
2) Ensuite si tu implémentes des méthodes elles doivent être inline car sinon tu auras potentiellement des erreurs au linkage si ce header est inclu à plusieurs endroits.
http://www.commentcamarche.net/faq/sujet 11250 les inlines en c
3) Il ne faut pas mélanger ta classe avec ce qui permet de la remplir. Par exemple ce que tu as fait dans afficherCaracteristiques devrait être fait dans ton main avec un appel à modifierPersonne. La c'est pas un problème de C++, c'est un problème de design de ton programme.
4) Tant que tu es dans la classe c'est à dire entre class Personne { ... }; tu ne dois pas rappeler Personne::. Cela ne sert que si tu implémentes une méthode de la classe Personne en dehors de cette paire d'accolade (typiquement dans personne.cpp si la classe est déclarée dans.hpp).
5) Les attributs devraient figurer au début de la classe. Outre le fait que ça peut mal compiler, c'est surtout plus lisible.
6) En C et en C++ il faut bien voir que tu passes tes paramètres par copie. Ca peut être particulièrement lent (si le paramètre est gros) et en général tu n'as pas besoin de faire une recopie. On utilise essentiellement en C++ des passages par référence ou par pointeur qui sont beaucoup plus rapides. De plus un passage par valeur ne permet pas de modifier un paramètre. Lorsqu'une fonction ne modifie pas un paramètre tu es donc sensé passer une const référence, et sinon une référence. Seule exception, les types de bases (int etc...) sont petits donc ce n'est pas forcément de prendre en compte cette considération.
7) Le langage est sensible à la casse. Ca veut dire que m_Nom ce n'est pas la même chose que m_nom. De plus les caractères guillemets dans ton code ne sont pas bon, ce sont les guillemet au dessus de la touche E que tu es sensé utiliser. Je t'invite à utiliser un environnement de développement (genre code::blocks ou dev cpp sous windows et kdevelop ou anjuta sous linux) pour éviter ces déboires.
8) Au niveau de ton code tu initialises Personne avec un constructeur qui n'existe pas. Ci-dessous voici comment faire un constructeur "propre". Autant que possible, initialise les attributs de classe avant l'accolade ouvrante du constructeur (syntaxe spécifique aux constructeurs).
9) En terme de design de class tu es sensé faire un accesseur en lecture (set) et en écriture sur chaque attribut de classe modifiable. Plutôt que faire une méthode afficherCaracteristique autant implémenter <<.
10) En terme de design les attributs de Personne devraient être protected et non private. En effet une classe fille (par exemple Femme) devrait pouvoir manipuler les attributs d'une personne (oui cette phrase est tendancieuse).
11) Je me suis permise de changer tes conventions de nommage (les majuscules c'est mieux de les garder pour les #define et les template). Ce sont celles que j'utilise en pratique et personnellement je les trouves plus lisibles. Après chacun ses goûts ;-)
Voici le corrigé :
Bonne chance
2) Ensuite si tu implémentes des méthodes elles doivent être inline car sinon tu auras potentiellement des erreurs au linkage si ce header est inclu à plusieurs endroits.
http://www.commentcamarche.net/faq/sujet 11250 les inlines en c
3) Il ne faut pas mélanger ta classe avec ce qui permet de la remplir. Par exemple ce que tu as fait dans afficherCaracteristiques devrait être fait dans ton main avec un appel à modifierPersonne. La c'est pas un problème de C++, c'est un problème de design de ton programme.
4) Tant que tu es dans la classe c'est à dire entre class Personne { ... }; tu ne dois pas rappeler Personne::. Cela ne sert que si tu implémentes une méthode de la classe Personne en dehors de cette paire d'accolade (typiquement dans personne.cpp si la classe est déclarée dans.hpp).
5) Les attributs devraient figurer au début de la classe. Outre le fait que ça peut mal compiler, c'est surtout plus lisible.
6) En C et en C++ il faut bien voir que tu passes tes paramètres par copie. Ca peut être particulièrement lent (si le paramètre est gros) et en général tu n'as pas besoin de faire une recopie. On utilise essentiellement en C++ des passages par référence ou par pointeur qui sont beaucoup plus rapides. De plus un passage par valeur ne permet pas de modifier un paramètre. Lorsqu'une fonction ne modifie pas un paramètre tu es donc sensé passer une const référence, et sinon une référence. Seule exception, les types de bases (int etc...) sont petits donc ce n'est pas forcément de prendre en compte cette considération.
7) Le langage est sensible à la casse. Ca veut dire que m_Nom ce n'est pas la même chose que m_nom. De plus les caractères guillemets dans ton code ne sont pas bon, ce sont les guillemet au dessus de la touche E que tu es sensé utiliser. Je t'invite à utiliser un environnement de développement (genre code::blocks ou dev cpp sous windows et kdevelop ou anjuta sous linux) pour éviter ces déboires.
8) Au niveau de ton code tu initialises Personne avec un constructeur qui n'existe pas. Ci-dessous voici comment faire un constructeur "propre". Autant que possible, initialise les attributs de classe avant l'accolade ouvrante du constructeur (syntaxe spécifique aux constructeurs).
9) En terme de design de class tu es sensé faire un accesseur en lecture (set) et en écriture sur chaque attribut de classe modifiable. Plutôt que faire une méthode afficherCaracteristique autant implémenter <<.
10) En terme de design les attributs de Personne devraient être protected et non private. En effet une classe fille (par exemple Femme) devrait pouvoir manipuler les attributs d'une personne (oui cette phrase est tendancieuse).
11) Je me suis permise de changer tes conventions de nommage (les majuscules c'est mieux de les garder pour les #define et les template). Ce sont celles que j'utilise en pratique et personnellement je les trouves plus lisibles. Après chacun ses goûts ;-)
Voici le corrigé :
#include <iostream> // A déplacer éventuellement dans personne.hpp #include <ostream> #include <string> class personne_t { protected: std::string nom; std::string prenom; unsigned age; public : personne_t( const std::string & nom0, const std::string & prenom0, unsigned age0 ): nom(nom0), prenom(prenom0), age(age0) {} inline const std::string & get_nom() const { return nom; } inline const std::string & get_prenom() const { return prenom; } inline unsigned get_age() const { return age; } inline void set_nom(const std::string & nom0) { nom = nom0; } inline void set_prenom(const std::string & prenom0) { prenom = prenom0; } inline void set_age(unsigned age0) { age = age0; } }; inline std::ostream & operator <<(std::ostream & out,const personne_t & p){ out << "[nom: " << p.get_nom() << " prenom: " << p.get_prenom() << " age: " << p.get_age() << ']'; return out; } // fin personne.hpp. Si tu déplaces cette section dans personne.hpp, // pense à inclure "personne.hpp" dans le fichier .cpp qui contient ta // fonction main. int main() { personne_t eleve("Rois","Richard",33); std::cout << eleve << std::endl; eleve.set_age(69); std::cout << eleve << std::endl; return 0 ; }
Bonne chance
Jeking
Messages postés
5
Date d'inscription
jeudi 11 juin 2009
Statut
Membre
Dernière intervention
16 juin 2009
12 juin 2009 à 11:48
12 juin 2009 à 11:48
Bonjour mamie
Je suis beaucoup touché par votre réponse très bénéfique. Je vais améliorer mon travail. En effet je suis entrain de découvrir certaines choses en programmant et grâce aux orientations que vous m'avez faites je crois que je vais arriver.
Merci de votre part, c'est très gentil.
Je suis beaucoup touché par votre réponse très bénéfique. Je vais améliorer mon travail. En effet je suis entrain de découvrir certaines choses en programmant et grâce aux orientations que vous m'avez faites je crois que je vais arriver.
Merci de votre part, c'est très gentil.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
mamiemando
Messages postés
33473
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
21 janvier 2025
7 815
13 juin 2009 à 03:10
13 juin 2009 à 03:10
Ok, j'en déduis que ton problème est résolu ?
Bonjour
Avec l'aide de mamie j'ai pu faire quelque chose. J'avoue que le code de mamie est beaucoup plus explicite mais il fallait je le fasse selon une certaine compréhension afin d'apprendre certaines choses en oratiquant.
J'ai volontairement voulu garder ce code dans un même fichier pour comprendre la démarche. Sinon j'ai compris et pris en note le conseil de mamie
#include <iostream>
#include <string>
using namespace std;
class Personne //Création de la classe Personne
{
public:
//Méthodes
Personne();//Constructeur//pas obligatoire, l'initialisation de chaine de caractère se fait automatique
Personne::Personne(string Nom);
~Personne();//Destructeur
string afficherNom();
string afficherPrenom();
int afficherAge();
void donner(string Nom);
void donnerPrenom(string Prenom);
void donner(int Age);
private:
//Attributs
string m_Nom;
string m_Prenom;
int m_Age;
};
Personne::Personne()//Constructeur
{
m_Age= 0;
}
Personne::~Personne()//Destructeur
{
}
string Personne::afficherNom()
{
return m_Nom;
}
string Personne::afficherPrenom()
{
return m_Prenom;
}
int Personne::afficherAge()
{
return m_Age;
}
void Personne::donner(string Nom)
{
m_Nom = Nom;
}
void Personne::donnerPrenom(string Prenom)
{
m_Prenom = Prenom;
}
void Personne::donner(int Age)
{
m_Age = Age;
}
int main()
{
Personne Etudiant;//Création objet Etudiant.
Etudiant.donner("De Lourdes");//En supprimant cets lignes,
Etudiant.donnerPrenom("Marcel");// nous créons l'objet sans nom,sans prénom
Etudiant.donner(25);//si celle-ci est ignorée, l'âge sera par défaut comme dans le constructeur
cout << "Nom : "<< Etudiant.afficherNom() << endl;
cout << "Prenom : "<< Etudiant.afficherPrenom() << endl;
cout << "Age: " << Etudiant.afficherAge() << endl;
system("pause");
return 0;
}
Avec l'aide de mamie j'ai pu faire quelque chose. J'avoue que le code de mamie est beaucoup plus explicite mais il fallait je le fasse selon une certaine compréhension afin d'apprendre certaines choses en oratiquant.
J'ai volontairement voulu garder ce code dans un même fichier pour comprendre la démarche. Sinon j'ai compris et pris en note le conseil de mamie
#include <iostream>
#include <string>
using namespace std;
class Personne //Création de la classe Personne
{
public:
//Méthodes
Personne();//Constructeur//pas obligatoire, l'initialisation de chaine de caractère se fait automatique
Personne::Personne(string Nom);
~Personne();//Destructeur
string afficherNom();
string afficherPrenom();
int afficherAge();
void donner(string Nom);
void donnerPrenom(string Prenom);
void donner(int Age);
private:
//Attributs
string m_Nom;
string m_Prenom;
int m_Age;
};
Personne::Personne()//Constructeur
{
m_Age= 0;
}
Personne::~Personne()//Destructeur
{
}
string Personne::afficherNom()
{
return m_Nom;
}
string Personne::afficherPrenom()
{
return m_Prenom;
}
int Personne::afficherAge()
{
return m_Age;
}
void Personne::donner(string Nom)
{
m_Nom = Nom;
}
void Personne::donnerPrenom(string Prenom)
{
m_Prenom = Prenom;
}
void Personne::donner(int Age)
{
m_Age = Age;
}
int main()
{
Personne Etudiant;//Création objet Etudiant.
Etudiant.donner("De Lourdes");//En supprimant cets lignes,
Etudiant.donnerPrenom("Marcel");// nous créons l'objet sans nom,sans prénom
Etudiant.donner(25);//si celle-ci est ignorée, l'âge sera par défaut comme dans le constructeur
cout << "Nom : "<< Etudiant.afficherNom() << endl;
cout << "Prenom : "<< Etudiant.afficherPrenom() << endl;
cout << "Age: " << Etudiant.afficherAge() << endl;
system("pause");
return 0;
}
mamiemando
Messages postés
33473
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
21 janvier 2025
7 815
13 juin 2009 à 14:20
13 juin 2009 à 14:20
C'est mieux sauf qu'il y a des choses qui ne vont pas :
- le system("pause") n'est pas portable et devrait être changé par un getchar() (inclue <cstdio>)
- les membres private devraient être protected (cf cours sur les héritages)
- manifestement tu n'as pas vraiment voulu m'écouter sur les histoires de références et de namespace, ce qui est dommage car c'est assez primordial et tu as intérêt à prendre les bonnes habitudes dès le début,
- les attributs en fin de classe c'est mal car c'est assez illisible,
- ton design de classe (choix des méthodes) est assez éloigné de ce qu'on fait usuellement en programmation objet.
Néanmoins c'est ton code et il est clair qu'il faut l'écrire comme tu l'entends. Je ne te donne que des conseils pour avoir un programme efficace, portable et bien architecturé. Libre à toi de t'éloigner des sentiers battus, même s'ils ont fait leur preuves ;-)
Bonne continuation
- le system("pause") n'est pas portable et devrait être changé par un getchar() (inclue <cstdio>)
- les membres private devraient être protected (cf cours sur les héritages)
- manifestement tu n'as pas vraiment voulu m'écouter sur les histoires de références et de namespace, ce qui est dommage car c'est assez primordial et tu as intérêt à prendre les bonnes habitudes dès le début,
- les attributs en fin de classe c'est mal car c'est assez illisible,
- ton design de classe (choix des méthodes) est assez éloigné de ce qu'on fait usuellement en programmation objet.
Néanmoins c'est ton code et il est clair qu'il faut l'écrire comme tu l'entends. Je ne te donne que des conseils pour avoir un programme efficace, portable et bien architecturé. Libre à toi de t'éloigner des sentiers battus, même s'ils ont fait leur preuves ;-)
Bonne continuation
Bonjour mamie
je suis très touché sur votre contribution. Si j'ai placé cette solution c'était pour faire la différence entre votre solution et la mienne afin de pouvoir vite apprendre. Grâce à vos remarques je crois maintenant ce que j'ai à faire. Mais sauf que je suis entrain de lire le cours sur le site de Nawouak.net avec toutes explications mais sauf que j'ai toujours de lacunes pour comprendre.
je suis très touché sur votre contribution. Si j'ai placé cette solution c'était pour faire la différence entre votre solution et la mienne afin de pouvoir vite apprendre. Grâce à vos remarques je crois maintenant ce que j'ai à faire. Mais sauf que je suis entrain de lire le cours sur le site de Nawouak.net avec toutes explications mais sauf que j'ai toujours de lacunes pour comprendre.
mamiemando
Messages postés
33473
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
21 janvier 2025
7 815
14 juin 2009 à 18:54
14 juin 2009 à 18:54
QU'est ce que tu ne comprends pas ?
12 juin 2009 à 04:47
Un ramassi d'aneries, oui !!!
Quelle catastrophe !
(tout est mélange (C, C++, SDL, qt, etc sans faire la différence !) du grand n'importe quoi !
12 juin 2009 à 11:44
Je pense que vous n'êtes pas gentil pour de tels propos envers un débutant. Personne n'a le monopole de la connaissance.
12 juin 2009 à 17:08
Je trouve que tu y va un peu fort, c'est quasiment le seul site où l'on peu apprendre les bases de la programmation facilement!
Si tu trouves que j'ai tort n'hésite pas à m'envoyer l'adresse d'un meilleur site mais à mon avis je vais attendre longtemps.