Comment faire pour résoudre “N'est pas le nom d'un type” d'erreur
J'obtiens l'erreur suivante:
'class name' does not name a type
pour toutes mes classes.
Je soupçonne que c'est peut être une dépendance circulaire, mais je n'ai aucune idée de comment le résoudre que chaque classe nécessite l'accès à une fonction à partir de la prochaine. Ci-dessous sont mes classes:
Conteneur.h:
#ifndef CONTAINER_H
#define CONTAINER_H
#include "Factory.h"
class Container
{
public:
Container()
{
array = new int[10];
for (int i = 0; i < 10; ++i) {
array[i] = i;
}
}
Iterator* createIterator()
{
Factory fac;
return fac.factoryMethod();
}
friend class Iterator;
private:
int* array;
};
#endif //CONTAINER_H
Usine.h:
#ifndef FACTORY_H
#define FACTORY_H
#include "Iterator.h";
class Factory
{
Iterator* factoryMethod(Container* con)
{
return new Iterator(con);
}
};
#endif //FACTORY_H
Itérateur.h:
#ifndef ITERATOR_H
#define ITERATOR_H
#include "Container.h"
class Iterator
{
public:
Iterator(Container* con)
{
this->con =con;
}
int getFromIndex(int i)
{
return con->array[i];
}
private:
Container* con;
};
#endif //ITERATOR_H
main.cpp:
#include <iostream>
using namespace std;
#include "Container.h"
#include "Iterator.h"
int main() {
Container con;
Iterator* it = con.createIterator();
cout<<it->getFromIndex(2)<<endl;
return 0;
}
Je vous remercie d'avance pour toute aide.
Placer la fonction des organes .fichiers cpp.
Ont essayé ce, uniquement à mettre en ligne à des fins de démonstration.
Ont essayé ce, uniquement à mettre en ligne à des fins de démonstration.
OriginalL'auteur Keagansed | 2016-09-27
Vous devez vous connecter pour publier un commentaire.
C'est en effet une dépendance circulaire entre vos en-têtes.
Container.h
comprendFactory.h
, qui comprendIterator.h
, qui comprendContainer.h
.La solution est de déplacer la mise en œuvre des fonctions de membre de fichiers d'en-tête dans les fichiers source. De cette façon, les fichiers d'en-tête aurez seulement besoin de déclarations, pas des définitions, des classes, vous pouvez facilement mettre directement dans la "consommer" de l'en-tête des fichiers:
Puis, dans un fichier source (comme
Container.cpp
), de mettre en œuvre les fonctions de membre et d'inclure les en-têtes dont vous avez besoin:Container.cpp
(Dtto pour
Factory
etIterator
, bien sûr).N'oubliez pas de lier tous les fichiers source d'ensemble lors de la construction de votre dernière binaire.
OriginalL'auteur Angew
Comme l'a dit Dan, mettre le corps de fonction .fichiers cpp (différentes unités de traduction).
Aussi, si vous êtes seulement en utilisant des pointeurs vers un type, vous n'avez pas à
#include
. Juste faire de l'avant-déclaration.OriginalL'auteur Ivan Rubinson