C++ définition précédente d'erreur
Donc, grâce à ce site, j'ai trouvé la réponse à mon problème précédent. Je vais ajouter une fonction à une classe dans un GNU automake projet qui utilise un pointeur vers une doc
objet. Les dépendances ont été inclus dans le fichier Makefile.suis fichier à inclure doc.h
et plsa.h
dans l'ordre respectif. Cependant, lorsque j'ai compilé, je voudrais obtenir un doc has not been declared
erreur. Ensuite, j'ai essayé d'ajouter l'instruction #include ici, ce qui donne une previous redefinition of 'class doc'
erreur.
J'ai appris que je dois déclarer doc
à l'aide de la class doc;
ligne en commentaire ci-dessous; cependant, je pensais que c'était seulement nécessaire si j'étais la déclaration d'une fonction qui passe l'objet en valeur. Quelqu'un peut m'expliquer pourquoi le #include est incorrecte dans ce cas?
#include "doc.h"
//class doc;
class plsa {
//...
int infer(doc *trset, int maxiter, double noiseH);
}
OriginalL'auteur Nick Ruiz | 2011-10-27
Vous devez vous connecter pour publier un commentaire.
Pourquoi la Redéfinition des erreurs?
Veuillez vous assurer que vos fichiers d'en-tête approprié L'En-Tête Des Gardes/Inclure Des Gardes.Il est plus que probable que vous avez manqué l'ajout de l'en-tête des gardes et, par conséquent, que les causes multiples définitions de classe en raison de l'en-tête de arriver inclus plusieurs fois.
Pourquoi Déclaration est d'accord dans ce cas?
Quand au lieu d'inclure le fichier d'en-tête vous ajoutez la ligne:
Il de l'Avant, déclare la classe
doc
ce qui signifie pour le compilateur, c'est un de type Incomplète. Avec Incomplètes types, On ne peut pas créer des objets ou faire quelque chose qui a besoin du compilateur à savoir la mise en page dedoc
ou plus que le fait quedoc
est juste un type.j'.e: Le compilateur ne sait pas quelles sont ses membres et de ses disposition de la mémoire.
Mais Depuis que des pointeurs vers tous les objets doivent tout de même l'allocation de mémoire, Vous pouvez utiliser la déclaration anticipée lorsque le juste se rapportant à un type Incomplète comme un pointeur.
Dans ce cas, le seul moyen de s'en
doc
est référencé est un pointeur vers la classedoc
et donc la déclaration anticipée fonctionnera aussi bien.Ligne de fond:
Y compris le fichier d'en-tête doit travailler pour vous Si vous avez l'Inclusion des Gardes sur place.
Et il n'y a rien de mal à cela.
Toutefois, Avant de déclarer la classe doit également travailler pour vous parce que de la motivation ci-dessus.Notez que les déclarations sont généralement utilisés dans les cas où il y a une Dépendance Circulaire de classes.
Qui est mieux
Include header File
ouForward Declaration
?Y compris l'en-tête de fichier copie colle le code dans l'en-tête à l'endroit où le fichier a été inclus, ce qui en fait pourrait conduire à:
Déclaration anticipée, a ses propres limites sur la façon dont le type Incomplète peuvent être utilisés plus loin.
Avec type Incomplète, vous pouvez:
Incomplète de type vous ne pouvez pas:
Compte tenu de la possibilité(en raison de limitations ci-dessus sur Incomplète type d'utilisation), On doit préférer l'Avant de la Déclaration, y Compris l'en-Tête.
Mis à jour afin de donner plus de détails.Hth.
OriginalL'auteur Alok Save
Il vous manque aussi les tuteurs. si vous suffit d'inclure les fichiers, ils sont juste collées, vous devez vous assurer que lorsqu'ils sont inclus plusieurs fois qu'ils d'autres fois le code n'est pas dupliqué. si vous utilisez une construction de ce genre.
OriginalL'auteur Alex