Utilisation incorrecte de structure de type incomplète, même avec une déclaration forward
Je suis au courant de dépendances circulaires, mais même avec sa déclaration, j'obtiens cette zone.
Ce que je fais mal?
//facility.h
class Area;
class Facility {
public:
Facility();
Area* getAreaThisIn();
void setAreaThisIsIn(Area* area);
private:
Area* __area;
};
//facility.cpp
#include "facility.h"
#include "area.h"
{ ... }
//area.h
class Facility;
class Area {
public:
Area(int ID);
int getId();
private:
std::list<Facility*> _facilities;
};
//area.cpp
#include "area.h"
#include "facility.h"
Donc cette compile bien, mais si je ne
//foo.h
#include "facility.h"
class Foo { .. };
//foo.cpp
#include "foo.h"
void Foo::function() {
Facility* f = new Facility();
int id = f->getAreaThisIsIn()->getId();
Quand je reçois invalid use of incomplete type struct Area
source d'informationauteur robev
Vous devez vous connecter pour publier un commentaire.
Pour
Facility* f = new Facility();
vous avez besoin d'une déclaration complète, pas juste à l'avant de la déclaration.Pour clarifier les choses: une déclaration anticipée vous permet de faire fonctionner sur un objet, le cas est très limitée:
Déclaration peut aider dans certains cas. Par exemple, si les fonctions de dans un en-tête uniquement des pointeurs vers des objets au lieu de les objets, alors vous n'avez pas besoin de
#include
l'ensemble de définition de classe pour que l'en-tête. Cela peut améliorer votre temps de compilation. Mais la mise en œuvre de cet en-tête est presque garanti à besoin de#include
la définition pertinente parce que vous êtes susceptibles d'aller de l'affectation de ces objets, l'appel de méthodes sur les objets, etc. et vous avez besoin de plus qu'une déclaration anticipée de le faire.Avez-vous #inclure à la fois la zone.h et de facilité.h en foo.cpp (en supposant que c'est le fichier où vous obtenez le message d'erreur)?