C++ c++;编译器错误类没有名为的成员

C++ c++;编译器错误类没有名为的成员,c++,typedef,member,compiler-construction,C++,Typedef,Member,Compiler Construction,我有一个叫做边的类和一个叫做顶点的类 在我的Edge类中,有一个对称为target的顶点的引用。在Vertex中,我发送了一条边,试图通过该边更改目标,但出现了一个编译器错误,即类Edge没有名为target的成员 我的优势是 #include "Vertex.h" class Edge { public: Edge *data; Edge *next; Vertex *target; Edge(); Edge(Edge *x); Edge(Verte

我有一个叫做边的类和一个叫做顶点的类

在我的Edge类中,有一个对称为target的顶点的引用。在Vertex中,我发送了一条边,试图通过该边更改目标,但出现了一个编译器错误,即类Edge没有名为target的成员

我的优势是

#include "Vertex.h"

class Edge
{
  public:
   Edge *data;
   Edge *next;
   Vertex *target;

   Edge();
   Edge(Edge *x);
   Edge(Vertex *x);

   void print();

};
该错误是由Vertex.cpp中的此代码引起的

Vertex::Vertex(Edge *x)
{
  name = x->target->name;
  next = x->target->next;
  mark = x->target->mark;
  previous = NULL;
  next = NULL;
}
当我试图编译顶点时,确切的错误是

 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’

如果我理解正确的话,您似乎在.cpp中有Edge的类声明,而不是.h(那么标题中有什么?)。Vertex中的错误是因为编译器在查找Edge类时,在Edge头中找不到声明——换句话说,它是隐藏的。边缘类声明应该在头文件中,定义应该在.cpp中。还要注意,这是循环依赖的一个很好的例子,它通常会导致痛苦。看看你能不能打破它们


编辑:谢谢你把准确的错误放在那里,它几乎证实了我们所有的猜测。确保两个类都可以看到对方——确保顶点包括边的标题。如果类足够小,您可能希望将它们都转储到一个文件中,正如Falmari所建议的那样。另外,不要忘记使用来解决这些类型的循环依赖关系。如果在类中包含指向外部类的指针或引用,但它不适用于类中的实际对象(如
Edge;
),则可以向前声明。我认为这是因为指针和引用只是地址,所以编译器不需要知道内部内容,但要使用实际对象,您必须知道其中的内容。

将Edge声明放在Edge.h中,并在Vertex.cpp中包含Edge.h。

似乎您有一个循环依赖关系。您可以通过在未声明的类名之前添加
class
来修复它,如
class Vertex*target在您的
Edge
声明中。

所有其他答案都正确地解释了两个类之间的循环依赖性问题,并解释了如何解决它

我的建议是使顶点类不知道边类。只需将getTargetVertex()和getSourceVertex()方法添加到edge类,并仅使用Vertex类中的复制构造函数即可


当然,如果不检查可用边池/边列表中的每个边实例,此解决方案将很难知道哪些边是指向顶点的边。

如果在edge.cpp中声明了边,则该声明将不可用于vertex.cpp。是否在vertex.cpp中包含了edge.h?错误可能是“Edge没有名为target的成员,因为尚未定义类型”。如果这些文件彼此包含,它们真的需要位于单独的头中吗?听起来像顶点和边缘是紧密耦合的,你应该考虑把它们放在同一个文件中。另一个问题是:有权利的人会把标签“编译器”改成“编译器”吗?最好以某种方式锁定“complier”,这样其他人就不会陷入这种拼写陷阱?向我们展示更多代码,粘贴
Vertex.h
Edge.cpp
Edge.cpp是#include#使用名称空间std包含“Edge.h”;Edge::Edge(){data=NULL;next=NULL;target=NULL;}Edge::Edge(Edge*x){data=x;target=NULL;next=NULL;}Edge::Edge(Vertex*x){target=x;}void Edge::print(){cout@John马库斯:谢谢你提供的额外信息,我用另一种方法更新了我的答案(转发声明)谢谢你的帮助,我在Edge中添加了顶点的正向声明,非常感谢