C++ c++;编译器错误类没有名为的成员
我有一个叫做边的类和一个叫做顶点的类 在我的Edge类中,有一个对称为target的顶点的引用。在Vertex中,我发送了一条边,试图通过该边更改目标,但出现了一个编译器错误,即类Edge没有名为target的成员 我的优势是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
#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中添加了顶点的正向声明,非常感谢