Et découper ses programmes en fichiers, c'est bien. Tu n'es pas obligé d'avoir un .h pour chaque .cpp. Tu peux mettre du code dans un .h moyennant quelques hacks, ou inclure un .cpp directement.
La ou c'est pratique, c'est sur des gros programmes, tu codes dans le .cpp et tu mets des enormes commentaires qui détaillent chaque fonction, classe, variable, dans le .h, comme ça si quelqu'un qui ne connait pas doit travailler dessus, il n'a qu'a lire les .h au lieu de se taper tout le code.
Mauvaise idée : si tu inclues les cpp, la moindre modification de ta fonction provoque la recompilation de tous les objets correspondant. Pour un petit projet, ça n'est pas forcément gênant, mais ça peut vite devenir horrible quand ton projet grandit, ou que tu utilises des libraires externes.
Pour ce qui est des commentaires, la bonne pratique est de les réduire au minimum nécessaire. Le code doit être le plus explicite possible, quitte à le re-factoriser ou le re-séparer en fonctions. Et les commentaires ne doivent pas expliquer ce que fait le code (ça doit se comprendre à partir du code) mais expliquer certains choix d'implémentations.
Les seuls commentaires descriptifs sont ceux qui servent à générer des documentations automatiquement (par exemple avec Doxygen).
Une fois de plus, ce sont des bonnes pratiques qui ne sont pas obligatoires, mais d'expérience, ça réduit la difficulté à re-rentrer dans le code plus tard ou les chances de se perdre entre les différents fichiers.
Demandes toi si ta fonction pourrait être utilisée dans un autre programme, ou même dans ton programme mais dans différents contextes.
Si oui, alors les paramètres de cette fonction devraient être des pointeurs.
???
Je ne suis pas sûr de comprendre ce que tu veux dire par là.
Une fonction prend un pointeur en argument si elle doit modifier cet argument. Si tu veux utiliser une fonction spécifique dans un autre programme, tu déclares ta fonction dans un header, tu l'implémentes dans un fichier cpp, puis dans ton code principal (qui contient le main), tu fais un #include "chemin/vesr/le/header.h", et tu indiques au compilateur qu'il faut également compiler le fichier correspondant puis éditer les liens avec ces objets.
Que cette fonction prenne ou non un pointeur en argument ne rentre pas en compte.
Un petit example:
programmeprincipal.cpp
-----
#include <vector>
#include <string>
#include "mafonction.h"
int main(int argc, char** argv)
{
std::string qualificatifs[] = {"pas du tout", "un peu", "beaucoup", "passionnément", "à la folie"};
std::vector<std::string> degreAmour(qualificatifs, qualificatifs + sizeof(qualificatifs) / sizeof(qualificatifs[0]));
int amourActuel = 0;
for(int i = 0 ; i < 10 ; i++)
{
direMonAmourDesBananes(degreAmour, &amourActuel);
}
return 1;
}
-----
mafonction.h
-----
#pragma once
#include <vector>
#include <string>
void direMonAmourDesBananes(std::vector<std::string> da, int * aa);
-----
mafonction.cpp
-----
#include <iostream>
#include "mafonction.h"
// on utilise un pointeur pour aa pour illustrer un cas où un pointeur est nécessaire.
void direMonAmourDesBananes(std::vector<std::string> da, int * aa)
{
if(*aa == da.size()){ (*aa) = 0; }
else
{
std::cout << "J'aime " << (*aa < (da.size()-1) ? da.at(*aa)+" " : "") << "les bananes" << ( *aa == (da.size() -1) ? " "+da.at(*aa) : "") << "." << std::endl;
(*aa)+=1;
}
}
r1d1@nova:~/codeTests/basicCompilationExample$ g++ *.cpp -c
r1d1@nova:~/codeTests/basicCompilationExample$ g++ -Wall *.o -o monprogramme
r1d1@nova:~/codeTests/basicCompilationExample$ ./monprogramme
J'aime pas du tout les bananes.
J'aime un peu les bananes.
J'aime beaucoup les bananes.
J'aime passionnément les bananes.
J'aime les bananes à la folie.
J'aime pas du tout les bananes.
J'aime un peu les bananes.
J'aime beaucoup les bananes.
J'aime passionnément les bananes.
Quelques compléments d'information :
- la structure (*aa < (da.size()-1) ? da.at(*aa)+" " : "") est une condition ternaire : c'est l'équivalent python de :
"Vrai" if variable == True else "Faux"
- Vu que je veux afficher un texte différent à chaque fois que j'appelle la fonction, et que c'est ma variable amourActuel qui tient le compte du nombre d'appels, j'ai besoin de passer son adresse (le pointeur vers ma variable) dans la fonction pour pouvoir l'incrémenter.
Si je ne passe que la valeur de la variable (ce qu'on obtient quand on utilise le nom), je fais une copie de la valeur qui n'a de portée que dans la fonction (donc la copie est détruite quand la fonction se termine et la valeur de amourActuel n'est pas modifiée).
- Je compile d'abord chaque code cpp individuellement (grâce à l'option -c), puis je combine mes objets en un seul (édition de liens :
https://fr.wikipedia.org/wiki/Édition_de_liens).- Les bananes, c'est trop cool pour écrire des exemples de code.