2017-02-17 5 views
0

Je suis chargé de l'implémentation d'une classe. On m'a fourni un fichier .h intitulé "pro.h" que je ne peux pas modifier d'aucune façon. Le fichier .h contient uniquement des prototypes de fonctions, pas de définitions. Après le bloc de classe, il a unePourquoi un fichier .hpp serait-il inclus dans un fichier .h?

#include "pro.hpp" 

Je suis censé créer un file.hpp pour ajouter les définitions bien, je suis confus parce que les définitions sont généralement inclus dans un fichier .cpp pas un autre fichier d'en-tête. Pourquoi pensez-vous que cela serait fait? Et aurais-je formater les définitions de la même façon que je le ferais dans un fichier .cpp, ou réécrire le fichier d'en-tête pour inclure les définitions (ce qui semblerait inefficace).

+2

Il n'y a rien de magique dans un fichier '.h', un fichier' .hpp' ou n'importe quel autre fichier. Le compilateur traite simplement tous les fichiers 'include ', comme indiqué. Vos extensions de fichiers peuvent être '.h',' .hpp', '.xyz' ou' .hjgiurejkcxkj'. Ce sera toujours C++ valide, tant que les fichiers en question, après avoir été logiquement inclus, contiennent du code C++ valide. –

+0

Merci, je voulais juste m'assurer que les compilateurs ne le compileraient pas différemment à cause de l'extension. –

+0

@AlessandroLorusso Vous (habituellement) ne compilez pas les fichiers d'en-tête pour commencer, donc il n'y a pas de problème. –

Répondre

1

Votre enseignant souhaite que vous implémentiez un modèle de classe. La chose à propos des templates est qu'ils doivent être instanciés avec le type de template correct, ce qui signifie que vous ne pouvez pas créer le binaire avant de savoir quel type il va être. C'est pourquoi l'implémentation est généralement écrite dans le fichier d'en-tête. Jetez un oeil f.e. here ...

Si vous êtes nouveau modèles, il suffit de demander oncle google ou fourmi wiki;)

ADD:

Pour faire simple ... quand vous avez quelque chose dans foo.cpp, il est traduit en binaire et l'en-tête correspondant foo.hpp sert de référence à quelles fonctions sont présentes dans le binaire que je pourrais utiliser depuis mon autre code. L'important est que ce binaire ne change plus (vraiment). D'autre part, les modèles ne peuvent pas être transformés en binaire, jusqu'à ce que vous sachiez sur quel type il va fonctionner ... Si vous utilisez la classe de modèle une fois avec int et une autre fois avec vector<double> pour le paramètre de modèle , le binaire résultant pourrait être très très différent ... Donc vous ne pouvez compiler le code dans le binaire qu'une fois que vous connaissez le type, et donc vous devez passer le code (à l'intérieur de l'en-tête) au lieu de prototypes ...

Espérons que cela soit clair. Il est après tout près de 3 heures du matin ici.

Sinon, this devrait être très complet.

+0

Cela a beaucoup aidé, merci –