Séparer le code de classe dans un en-tête et un fichier cpp
Je suis confus sur la façon de séparer la mise en œuvre et les déclarations de code d'une classe simple dans un nouvel en-tête et un fichier cpp. Par exemple, comment pourrais-je séparer le code pour la classe suivante?
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y)
{
gx = x;
gy = y;
}
int getSum()
{
return gx + gy;
}
};
- Juste un couple de commentaires: Le constructeur doit toujours utiliser une liste d'initialisation au lieu de mettre les membres dans le corps. Pour une bonne et simple explication, voir: codeguru.com/forum/showthread.php?t=464084 C'est aussi, au moins la plupart des endroits, de coutume d'avoir le champ public au top. Il n'affecte en quoi que ce soit, mais, étant donné que le champs est la documentation de votre classe, il est logique d'avoir que dans le haut.
- Ayant
public:
membres au sommet pourraient affecter beaucoup de choses, si l'utilisateur déplace selon cet avis -, mais avait de la commande de dépendances entre les membres et n'était pas encore au courant que les membres sont initialisées dans l'ordre de leur déclaration 😉 - ce qui est vrai. Mais là encore, nous sommes tous de la compilation avec les avertissements d'erreurs et de tous les avertissement que nous pouvons penser, à droite? Au moins vous dire que vous êtes vissage cette place, mais ouais, les gens utilisent de manière à peu mises en garde, et il suffit de les ignorer 🙁
- Bon point, un peu oublié qui génère des avertissements - si seulement les avertissements ont été lus par la plupart 🙂 je les utiliser et d'essayer de code tous. Quelques-uns sont inévitables, alors je dis 'merci pour l'avertissement, mais je sais ce que je veux faire!" - mais la plupart sont mieux fixés pour éviter toute confusion plus tard.
Vous devez vous connecter pour publier un commentaire.
La déclaration de classe va dans le fichier d'en-tête. Il est important que vous ajoutez le
#ifndef
inclure des gardes, ou si vous êtes sur une MME plateforme vous pouvez également utiliser#pragma once
. Aussi, j'ai omis le privé, par défaut, les membres de classe C++ sont privés.et la mise en œuvre de passe dans le fichier CPP:
#ifndef
des trucs dans la tête?.cpp
sans problèmethis
mot dans le .rpc fichier à l'aide de cette séparation?En général votre .h contient la classe defition, qui est l'ensemble de vos données et tous vos déclarations de méthode. Comme dans votre cas:
Et alors votre .rpc contient les implémentations des méthodes comme ceci:
Essentiellement d'une version modifiée de la syntaxe de déclaration de fonction/définitions:
a2dd.h
a2dd.cpp
A2DD.h
A2DD.cpp
L'idée est de garder toutes les signatures de la fonction et des membres dans le fichier d'en-tête.
Cela va permettre à d'autres fichiers de projet pour voir comment la classe ressemble sans avoir à connaître la mise en œuvre.
Et en plus de cela, vous pouvez alors inclure d'autres fichiers d'en-tête dans la mise en place de l'en-tête. Ceci est important car, selon les en-têtes sont inclus dans votre fichier d'en-tête sera inclus (hérité) dans un autre fichier qui contient votre fichier d'en-tête.
Il est important de préciser aux lecteurs tombent sur cette question lors de la recherche de l'objet dans un cadre plus large de la mode que l'on a accepté la réponse de la procédure n'est pas requise dans le cas où vous ne voulez diviser votre projet dans les fichiers. Il est uniquement nécessaire lorsque vous avez besoin de plusieurs implémentations des classes uniques. Si votre mise en œuvre par classe est un, juste un fichier d'en-tête pour chaque suffit.
Par conséquent, de la accepté de répondre à l'exemple de la seule cette partie est nécessaire:
Le #ifndef etc. définitions de préprocesseur lui permettre d'être utilisé plusieurs fois.
PS. Le sujet devient plus clair une fois que vous vous rendez compte C/C++ est "idiot", et #include est simplement une façon de dire "vidage de ce texte à cet endroit".
.cpp
, ou n'est.h
vraiment de "bon" pour cette méthode d'organisation de code?Vous laissez les déclarations dans le fichier d'en-tête:
Et de mettre les définitions dans le fichier d'implémentation.
Vous pouvez mélanger les deux (congé
getSum()
définition dans l'en-tête par exemple). C'est utile car il donne le compilateur une meilleure chance à l'in-lining, par exemple. Mais cela signifie aussi que la modification de la mise en œuvre (si on les laisse dans l'en-tête) pourrait déclencher une reconstruction de tous les autres fichiers qui incluent l'en-tête.Noter que pour les modèles, vous devez conserver tous les dans les en-têtes.
Généralement vous mettre uniquement des déclarations et très peu de fonctions en ligne dans le fichier d'en-tête:
Par exemple: