Ceci pourrait être une question en double, mais tous mes résultats de recherche parlent de ne pas mettre Je suis nouveau à C ++ et j'essaie de m'assurer que j'apprends / en utilisant les meilleures pratiques. Je sais que les fichiers d'en-tête sont destinés à définir des cours, des structures et autres et ne devraient jamais "faire" quoi que ce soit. Cela inclut-il en utilisant code> dans un fichier d'en-tête, ce qui n'est pas ma question. J'ai lu sur cela et j'ai compris pourquoi vous ne devez pas placer
en utilisant code> à l'intérieur d'un fichier d'en-tête. P>
std :: cou code>? Est-ce que c'est considéré comme faire quelque chose? Ce que je veux dire, c'est que c'est bien d'imprimer une sortie à partir d'un fichier d'en-tête ou dois-je renvoyer des données sur mon fichier * .cpp et faire la sortie de là-bas? Ou cela n'a pas vraiment d'importance? P>
3 Réponses :
Il n'y a rien de mal en principe avec L'art des définitions de fractionnement entre le fichier d'en-tête et le fichier .CPP est souvent un appel de jugement. En règle générale, lorsque vous définissez des fonctions dans le fichier d'en-tête, vous pourriez espérer de meilleures performances (car l'inlinage serait plus facilement atteinte), mais vous Au lieu de demander les meilleures pratiques, je vous suggère de tout coeur que vous comprenez quels sont les mécaniciens à jouer là-bas et faire un choix conscient vous-même. P> faire code> choses dans le fichier d'en-tête. En effet, l'en-tête Seules les bibliothèques sont assez populaires dans C ++ de nos jours. Dans certains cas (tels que des modèles)
faire code> les choses dans le fichier d'en-tête sont le seul moyen d'aller. P>
Pour la plupart convenant, je suis d'accord sur la prise de décision consciente et je le fais habituellement. Mon objectif principal est de passer l'examen de la CPA. Je suis un programmeur plutôt expérimenté dans d'autres langues et je suis maintenant en train de passer à C ++. Récemment, dans une interview, l'un des points clés qu'ils ont faits était que je n'ai pas suivi les meilleures pratiques (je suis paraphrasant), ma question est donc plus directement sur les meilleures pratiques plutôt que sur la mécanique. Ma compréhension de la CPA est qu'il suit «les meilleures pratiques» plus que les applications du monde réel.
Ils enseignent C ++ aux comptables maintenant? Le monde devient de plus en plus hardcore.
Pas du tout. cppinstitute.org/...
@Xandor Si votre objectif est de passer un examen de certification, vous devriez probablement étudier les documents associés à l'examen pour apprendre leurs meilleures pratiques i>. Les meilleures pratiques ne sont pas universellement convenues.
@erorika absolument. Je suis complètement d'accord. Mais étant donné le sujet de ma question, cela concerne cet examen. Je peux apprendre des hacks et des astuces toute la journée pour contourner certains problèmes (comme mettre tout mon code dans un fichier ou simplement aller de l'avant et définir des classes dans son ensemble dans un fichier d'en-tête) mais cela ne me fait pas bon. De toute évidence, je vais vouloir faire quelque chose avec ce certificat et donc besoin d'apprendre de bonnes habitudes de codage si je prévois de travailler dans une équipe.
IMHO ... P>
Utilisation de Utilisation de STD :: COUT CODE> Dans n'importe quel fichier dans une bibliothèque est un symptôme de la conception médiocre. Si vous devez produire quelque chose, fournissez l'interface du code client pour réussir un code> ostream code> ou un objet code> tstream code> -itant qui prend en charge l'insertion de données. P>
std :: COUT CODE> Dans un fichier spécifique à l'application, sélectionnez un fichier d'en-tête ou un fichier .CPP, parfaitement bien. P>
Bien que les deux réponses actuelles répondent plus ou moins à ma question, celle-ci parle plus directement de ma préoccupation et est donc la réponse acceptée pour moi.
est STD :: COUT dans un fichier d'en-tête BORD PRATIQUE? P>
Pas nécessairement. Par exemple, vous pourriez avoir une fonction qui génère une séquence de caractères dans un flux. Il serait utile de laisser le client de la fonction choisir quel flux à utiliser, de sorte que la fonction accepte le flux comme argument. Cela pourrait avoir beaucoup de sens pour la fonction d'avoir le comportement par défaut du streaming dans le flux de sortie standard. Par conséquent, vous pourriez avoir une déclaration de fonction dans une en-tête, telle que: p>
xxx pré> blockQuote>
Vous devriez en apprendre davantage sur le une règle de définition . Si vous définissez vos fonctions dans les en-têtes, vous risquez de le violer car la complexité de votre projet augmente.
Dupliqué possible de Stackoverflow.com/ Questions / 333889 / ...
@ Françoisandrieux Votre commentaire omet des pièces cruciales, y compris des fonctions et des modèles en ligne.
@Sergeya c'est ce que le lien est pour. Mon commentaire est un résumé abrégé. Aucune utilisation répétant le tout.
@ Françoisandrieux Je pense que vous avez mal compris ma question. Je ne demande pas de définir ou de déclarer dans un en-tête. Je demande si l'impression de sortie dans un en-tête envisage de "faire quelque chose" et donc de la mauvaise pratique. Votre commentaire ne répond pas à ma question et votre "duplicate" n'est pas du tout ce que je demande.
@Xandor, il n'y a rien de spécial sur la sortie dans ce contexte. Notez que si je pensais que mon commentaire répondit à votre question, j'aurais commis une réponse. Et Notez que le deuxième commentaire est un possible i> en double i>, en fonction de l'interprétation de la question, invitant d'autres personnes qui partagent cette interprétation à voter pour clôturer ou uppoter le commentaire de voir si la communauté peut atteindre un quorum.
Vous ne pouvez pas imprimer avec
COUT code> sans définir une fonction ou définir et initialiser une variable. Aucun dont vous voulez faire dans une en-tête sans avoir d'abord envisagé ODR.
@ FrançoisAndrieux assez juste, et je m'excuse si ma réponse est apparue comme hostile. J'essayais simplement de clarifier ce que je demandais donc il y avait moins de problèmes d'interprétation de la question.
@ user4581301 Je ne suis pas sûr de comprendre ce que vous obtenez? Dans mon fichier d'en-tête, je peux faire quelque chose comme
std :: cout << "foobar"; code> et ça marche bien. L'Inclure dans mon fichier .CPP pour l'en-tête est après
#include code> et fonctionne donc bien. Dis-tu cela pour le cas d'utilisation de si mon en-tête est inclus dans un projet qui n'a pas
#include code> il ne compilera pas? Je ne pensais pas que c'était si fou pour un fichier d'en-tête nécessitant une autre inclure dans le fichier * .CPP. Cela étant dit que je demande aux meilleures pratiques afin que cela puisse être pertinent si vous pouviez clarifier pour moi.
@Xandor user4581301's Point est que
std :: COUT << "FOOBAR"; code> ne fonctionnera que si vous l'écrivez dans le contexte d'un corps de fonction. Signification Tout problème avec l'impression dans un en-tête est au moins aussi problématique que l'écriture d'une fonction dans un en-tête (car cela signifie que si vous imprimez, vous écrivez également une fonction) Rendre le lien entre votre question (impression dans les en-têtes) et le problème avec les fonctions d'écriture dans les en-têtes en général.
@ Françoisandrieux alors où sont-ils des cours à définir? Je pensais que c'était considéré comme la meilleure pratique de définir des classes dans un fichier d'en-tête. Cette classe arrive à contenir des fonctions relatives à l'objet de la classe. D'après ce que vous dites, cela ressemble à ceci est / devrait être la racine de ma préoccupation.
Les cours sont vraiment soignés. Une méthode entièrement définie dans la classe devient efficacement une fonction intégrée (il y a quelques différences, mais aucune matière qui compte ici) et évite la règle d'une définition. Une variable définie dans la classe n'existe pas tant que la classe est instanciée, évitez également ODR.
@Xandor, il semble vraiment que le duplicate possible possible pourrait répondre à beaucoup de vos questions. Ce n'est pas un cope pour éviter de répondre à votre question. Les réponses de cette question éclairent probablement beaucoup de vos malententres.
Je pense que je peux comprendre maintenant. J'ai trouvé un exemple en ligne dans lequel un objet de classe est divisé en deux fichiers.
classe.h code> et
class.cpp code> où le fichier .h les déclare et le fichier .cpp les définit. Je suppose que c'est vraiment tout mon problème. Pour moi, en tant que programmeur autodidacte, je ne vois aucune raison d'avoir le fichier .h, mais ce que je lis dit que vous "devrait". Pourquoi?
@Xandor, c'est exactement ce que la duplication possible liée pose. Quelle est la raison d'avoir des fichiers distincts .h et .cpp.
J'ai besoin de me corriger. C ++ 11 standard dit, une fonction définie dans une définition de classe est une fonction inline. , je suppose qu'il n'y a pas de différence, du moins pas plus.
@ Françoisandrieux excuses, votre commentaire n'avait pas peuplé sur mon écran pendant que j'écrivais mon dernier. Oui, ce lien précise cela, je n'ai tout simplement pas compris le cœur de mon problème. Je m'excuse pour le dos et venez à ce sujet.
@Xandor Ce n'est pas un problème, cela arrive beaucoup. Il peut prendre du temps pour que toutes les parties convergent sur une compréhension commune.