Ok je me suis embalé un peu vite ! Plusieurs choses qui ne vont pas en relisant. j'ai testé dans mon coin et ca fonctionne.
Ce que te mets dans le .h il faut le mettre dans l'implémentation dans le .cpp :
.h :
string Personne::getNom()const { return m_nom; }
.cpp :
String Personne::getNom()const { return m_nom; }
ensuite, les getters tu leur met un paramètre dans le .cpp mais pas dans le .h :
.cpp :
string Personne::setNom(string nom)
.h :
string setNom(string nom);
et pour finir quand tu retournes ou que tu veux un string en parametre ne mets pas de void mais string, idem pour l'age. tu demandes un entier met un entier en déclaration.
.h :
int setAge(int age);
.cpp :
int Personne::setAge(int age);
Et pour finir j'ai juste affecté la bonne valeur :
Si ta classe ne contient que des données et des accesseurs, qu'elle n'offre ni service, ni invariant, c'est que c'est juste une simple structure qui agrège des données.
Il faut savoir rester simple et ne pas tomber dans le piège de croire que les accesseurs sont un signe de bonne POO. Bien au contraire. La bonne POO, c'est quand on s'intéresse aux services, pas aux données.
J'ai la flemme de chercher des liens, c'est un sujet déjà débattu et rebattu..
C'est une maladie infantile du programmeur que de croire (*) que tout ce qu'il y a dans son code doit absolument être un Objet isolé du reste du monde avec des accesseurs/mutateurs. (**)
Si le service à rendre par un Truc est précisément de regrouper un Machin et un Truc, une structure avec des champs publics fait très bien le boulot
(*) avec le zèle dogmatique des débutants qui se raccrochent à des Principes Sacrés édictés par des gourous par peur d'être frappés par la foudre si ils y contreviennent.
(**) déjà, on sait bien que la visibilité c'est plus compliqué que ça. Si il y a "friend" en C++ + 3 niveaux d'accessibilité, et 4 niveaux en Java, c'est pas pour rien.
Je sais que le post est ancien mais je suis également entrain de suivre le cours C++ et en parcourant ce post j'ai vu qu'il y avait "using namespace std" à la fois dans le fichier h et à la fonction dans le fichier cpp de la Classe.
Et dans le cours il est indiqué qu'il est déconseillé d'inclure cette ligne dans le fichier .h non....?
Heureux les fêlés car ils laissent passer la lumière...
Oui. Et ce n'est pas le seul endroit où le code présenté dans le cours ne respecte pas ce qui est expliqué dans le cours. (Sans compter ce qui n'est pas dit dans le cours, c'est probablement le pire)
En vrai .h ou .cpp, n'utilise pas un using namespace std; c'est un mauvais raccourci qui est fait. Il n'y a aucun coup mémoire à rajouter std:: devant ta string.
En vrai .h ou .cpp, n'utilise pas un using namespace std; c'est un mauvais raccourci qui est fait. Il n'y a aucun coup mémoire à rajouter std:: devant ta string.
- Edité par SixtyOne il y a environ 8 heures
Même dans les fichiers .cpp....? J'avoue que je le fait dans fichier main.cpp ainsi que dans les .cpp de mes classes. Mais dans les fichiers cpp des classes, il ne faudrait pas...?
Heureux les fêlés car ils laissent passer la lumière...
Ok, dans les .cpp cela peut être utile, voici un exemple :
class MySwap
{
};
namespace Util
{
void swap(MySwap& _a, MySwap& _b)
{
std::cout << "Bonjour\n";
}
}
using namespace std;
using namespace Util;
int main()
{
MySwap m {};
MySwap n {};
swap(m, n);
}
Ici ton compilateur va choisir la meilleur fonction à appeler pour swap, et dans notre cas il ne prendra pas la std::swap mais bien Util::swap. Mais pour moi ça reste un cas spécifique ou mettre ce using namespace dans ton .cpp est cohérent.
Le problème de using namespace est qu'il copie tous les symboles accessibles d'un namespace dans un autre namespace et cela de manière irréversible. On peut se retrouver avec des conflits de nom entre la stl et notre code qui empêche le code de compiler, une mauvaise fonction utilisée, etc. Si les namespace existent, c'est justement pour éviter les conflits de nom.
Dans un .h c'est très grave puisque tous ceux qui incluent ce .h subiront immédiatement using namespace. Dans un .cpp ce l'est moins car uniquement ce .cpp sera impacté. Mais les problèmes de conflits de nom, etc existe toujours est il est donc également déconseillé.
Même dans les fichiers .cpp....? J'avoue que je le fait dans fichier main.cpp ainsi que dans les .cpp de mes classes. Mais dans les fichiers cpp des classes, il ne faudrait pas...?
Non, de fait, il ne faudrait pas le faire, même dans les fichier .cpp...
La directive using namespace a été ajoutée pour répondre à un problème bien précis qui est apparu à un moment bien précis, et dont on peut partir du principe qu'il aura disparu "de lui-même" avec la première mise à jour des compilateur et de leur bibliothèque standard.
Cette "première mise à jour" des compilateurs et de leur bibliothèque standard a eu lieu il y a plus de vingt ans, et la raison d'être de cette directive a donc disparu à ce moment là.
La directive est restée uniquement parce qu'elle avait déjà été implémentée et que, bien que devenue inutile, il n'était pas nécessaire de la supprimer, ni de la norme, ni des compilateurs qui l'ont implémentée (dans un soucis de compatibilité ascendante )
Tu trouveras toute une dissertation de ma part ==>ici<== pour te convaincre du problème
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
SixtyOne a écrit:
> Ici ton compilateur va choisir la meilleure fonction à appeler pour swap, et dans notre cas il ne prendra pas la std::swap mais bien Util::swap. Mais pour moi ça reste un cas spécifique ou mettre ce using namespace dans ton .cpp est cohérent.
Aucune raison de mettre un using namespace pour une seule fonction, encore moins dans le namespace global. De plus, les fonctions utilitaires de ce genre devraient être dans le même namespace que la classe pour profiter de l'ADL, si on ne veut pas d'ADL, il ne faut surtout pas faire des using à tout-va.
Il y a aussi d'excellents ouvrages de programmation en C++ oû l'auteur a choisi délibérément de mettre un .hpp contenant using namespace std dans chaque programme, pour simplififier la vie des debutants avec un langage qu'il trouve un peu compliqué.
Mais bon, ce Stroustrup, il y connaît quoi, à la programmation ?
Ca, par contre, je trouve contestable. Dans le sens où dire une chose et montrer du code qui fait autrement, c'est pas une bonne idée généralement. Osef que ce soit Stroustrup.
Surtout que ca doit être plus une contrainte liée au format papier, et pas réellement un choix de sa part. Je pense que même Stroustrup sait que cela pose un problème en termes pédagogique.
Sur les forums, sur les cours en ligne et dans les exos, on n'a pas cette contrainte, donc il n'y a aucune raison de faire cela.
Stroustrup enseigne depuis des années à des débutants.
La plupart des choses qu'on enseigne à des debutants, c'est inutile pour des professionnels (échanger des variables ? Y a swap. Etc) ou à la limite des mauvaises pratiques dans du développement industriel. Quoi, pas de tests unitaires pour hello world ?
Je saisis si tu as le bonheur d'enseigner à des débutants complets, mais ce qui les bloque au départ, c'est le bombardement avec des tas d'informations et de contraintes - même avec les meilleures intentions d'en faire des professionnels compétents- qui ne concernent pas les premières bases. Le formateur n'est pas là pour étaler sa vaste connaissance de 50 points à la fois.
Dans l'enseignement des arts martiaux, les débutants et les 4ieme dan travaillent les mêmes mouvements. Le prof félicite les débutants qui ont réussi à différencier leur pied droit de leur main gauche, et les 4ieme dan se font engueuler parce que leur pied fait un angle de 10 degres de trop
- Edité par michelbillaud 6 novembre 2020 à 18:40:43
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Architecte logiciel - Software craftsmanship convaincu.
Heureux les fêlés car ils laissent passer la lumière...
Discord NaN. Mon site.
Ma chaine youtube, une notion de c++ en 5 min !
Heureux les fêlés car ils laissent passer la lumière...
Ma chaine youtube, une notion de c++ en 5 min !
Heureux les fêlés car ils laissent passer la lumière...
Discord NaN. Mon site.
Discord NaN. Mon site.