Alors, disons que j'ai une en-tête comme ceci:
int BaseClass::x = 10;
4 Réponses :
Si vous le faites dans l'en-tête, vous obtiendrez plusieurs erreurs de définition dès que vous l'inclurez à partir de plusieurs fichiers de CPP. Vous racontez vraiment au compilateur deux choses lorsque vous déclarez
int BaseClass::x = 10;
Je pense que je commence à avoir l'idée, mais y a-t-il un moyen de le démontrer? Est-ce que je dois écrire deux programmes différents, qui incluent la base de base et les courent simultanéosly?
@ user3496846 Non, vous devez simplement avoir un seul programme composé de (au moins) deux fichiers CPP, qui incluent tous les deux votre en-tête.
Parce que si vous l'initialisez dans l'en-tête, il est possible que cela soit défini dans plusieurs endroits si vous incluez l'en-tête plus d'une fois. Qui entraînera une erreur de liaison p>
Les gardes n'empêchent pas plusieurs copies dans plusieurs fichiers source. Ils n'empiètent que plusieurs copies dans un fichier source. P>
Vous violerez la règle d'une définition si vous avez plusieurs fichiers source que #include "base_class.h" code>. p>
Peut-être qu'il est plus facile de comprendre si vous pensez à ce que le préprocesseur fait réellement: il copie le contenu de tous les fichiers d'en-tête inclus dans le fichier CPP et le transmet au compilateur.
Disons que vous avez: P >
int aGlobalVariable = 10;
Mais à part le #include "basoclass.h", le lien de lieur ne comprendra pas la double définition de la classe elle-même, qui devrait également causer un problème? Désolé, cela peut prendre du temps pour que je comprenne ...
Non, parce que c'est juste une classe Déclaration i>. J'ajouterai un peu à ma réponse à ma réponse
Ok, merci beaucoup pour une réponse aussi descriptive, je pense que je commence à avoir l'idée :)
La question de la question et des réponses ici sont supérieures à celles de la question désignée!