compilateur c++ classe d'erreur n'a pas de membre nommé
J'ai une classe appelée Bord et une classe appelée Sommet
dans mon Edge classe il y a une référence à un Sommet appelé cible. au Sommet j'ai envoyer un Bord et essayer de changer la cible à travers le Bord mais j'ai une erreur de compilation, de classe de Bord n'a pas de membre nommé cible.
mon Bord.h est
#include "Vertex.h"
class Edge
{
public:
Edge *data;
Edge *next;
Vertex *target;
Edge();
Edge(Edge *x);
Edge(Vertex *x);
void print();
};
l'erreur est causée par le présent code dans Vertex.cpp
Vertex::Vertex(Edge *x)
{
name = x->target->name;
next = x->target->next;
mark = x->target->mark;
previous = NULL;
next = NULL;
}
l'erreur exacte lorsque j'essaie de compiler le Sommet est
g++ -g -I. -c -o Vertex.o Vertex.cpp
In file included from Vertex.h:3,
from Vertex.cpp:3:
Edge.h:10: error: ISO C++ forbids declaration of ‘Vertex’ with no type
Edge.h:10: error: expected ‘;’ before ‘*’ token
Edge.h:14: error: expected ‘)’ before ‘*’ token
Vertex.cpp: In constructor ‘Vertex::Vertex(Edge*)’:
Vertex.cpp:26: error: ‘class Edge’ has no member named ‘target’
Vertex.cpp:27: error: ‘class Edge’ has no member named ‘target’
Vertex.cpp:28: error: ‘class Edge’ has no member named ‘target’
- Si le Bord est déclaré dans Edge.cpp, puis la déclaration ne sera pas disponible à Vertex.cpp.
- Avez-vous inluded Bord.h en Vertex.cpp? L'erreur pourrait être "Edge n'a pas de membre nommé de la cible, car le type n'est pas encore défini" juste un coup de poignard.
- Si ces fichiers comprennent les uns les autres, ont-ils vraiment besoin d'être dans des en-têtes? Des sons comme le Sommet et le Bord sont étroitement couplés, vous devriez envisager de les garder dans le même fichier.
- Autre chose: quelqu'un pourrait avec le droit des droits de modifier l'étiquette complier à "compilateur"? De préférence, verrouillage "compilateur" d'une certaine manière, de sorte que personne d'autre ne peut tomber dans cette orthographe piège?
- nous montrer plus de code, collez
Vertex.h
etEdge.cpp
Vous devez vous connecter pour publier un commentaire.
Si je comprends correctement la situation, il semble que vous avez de la déclaration de classe de Bord dans le .rpc, plutôt que de la .h (ce qui est dans l'en-tête alors?). L'erreur dans le Vertex se pose parce que lorsque le compilateur recherche le Bord de la classe, il ne peut pas trouver la déclaration en Bordure de l'en-tête--en d'autres termes, il est caché. Votre Bord de la déclaration de classe doit être dans le fichier d'en-tête et la définition devrait être dans les .rpc. Notez également que c'est un beau cas de dépendances circulaires, qui peut souvent conduire à la douleur. Voir si vous ne pouvez pas les casser.
Edit: Merci pour la mise à l'erreur exacte là-haut, c'est assez bien confirmé toutes nos suppositions. Assurez-vous que les deux classes peuvent voir les uns les autres--veiller à ce que le Sommet comprend Bord de l'en-tête. Si les classes sont assez petits, vous pouvez les jeter à la fois dans un seul fichier, comme Falmarri suggéré. Aussi, ne pas oublier d'utiliser déclaration pour résoudre ces types de dépendances circulaires. Vous pouvez déclarer avant si vous incluez des pointeurs ou des références à l'extérieur de la classe dans votre classe, mais il ne fonctionne pas avec des objets réels (comme
Edge edge;
) dans votre classe. Je crois que la raison pour cela est que les pointeurs et les références sont juste des adresses, de sorte que le compilateur n'a pas besoin de connaître le fonctionnement interne, mais d'utiliser un objet réel, vous devez savoir ce qui est à l'intérieur.Toutes les autres réponses correctement expliquer que vous avez un problème avec la dépendance circulaire entre les deux classes et d'expliquer comment le résoudre.
Ma suggestion est de faire le Sommet de la classe ignore le Bord de la classe. En ajoutant simplement la getTargetVertex() et getSourceVertex() les méthodes à la pointe de classe et en utilisant uniquement le constructeur de copie de la dans le Sommet de la classe.
Bien sûr, cette solution sera difficile de savoir quels sont les bords qui cible un sommet sans vérification de chaque bord de l'instance à votre disposition piscine/liste des bords.
Bord mis dans la déclaration de Bord.h et comprennent Bord.h en Vertex.cpp.
Semble que vous avez un cyclique dépendances. Vous avez pu le résoudre en ajoutant
class
avant de la non déclarées à la classe des noms commeclass Vertex *target;
dans votreEdge
déclaration.