C++;包括文件混淆 我试图在我的C++程序中包含文件,但是我一直遇到错误:

C++;包括文件混淆 我试图在我的C++程序中包含文件,但是我一直遇到错误:,c++,header,include,forward-declaration,C++,Header,Include,Forward Declaration,ShapeVisitor.h:9:28:错误:尚未声明“圆” 我认为问题在于类的结构方式导致了循环依赖。我如何解决这个问题 类标题在下面 //Circle.h #ifndef CIRCLE_H #define CIRCLE_H // headers, ... #include "Shape.h" class Circle: public Shape { //class declaration } #endif //Shape.h #ifndef SHAPE_H #define S

ShapeVisitor.h:9:28:错误:尚未声明“圆”

我认为问题在于类的结构方式导致了循环依赖。我如何解决这个问题

类标题在下面

 //Circle.h
 #ifndef CIRCLE_H
 #define CIRCLE_H
 // headers, ...
 #include "Shape.h"
class Circle: public Shape { 
//class declaration 
}
#endif

//Shape.h
#ifndef SHAPE_H
#define SHAPE_H
// headers, ...
#include <iostream>

class Shape {  
//a certain method in the class declaration looks like this
virtual void accept(ShapeVisitor& v) = 0; 
//rest of class
}
#endif

//ShapeVisitor.h
#ifndef SHAPEVISITOR_H
#define SHAPEVISITOR_H
#include "Circle.h"
class ShapeVisitor {
//a method in the class looks like this:
virtual void visitCircle(Circle *s) = 0;
//rest of class
}
#endif
//Circle.h
#伊芬德夫圆
#定义圆
//标题。。。
#包括“Shape.h”
类圆:公共形状{
//类声明
}
#恩迪夫
//形状.h
#ifndef形状
#定义形状
//标题。。。
#包括
类形状{
//类声明中的某个方法如下所示
虚拟无效接受(ShapeVisitor&v)=0;
//其他同学
}
#恩迪夫
//ShapeVisitor.h
#ifndef SHAPEVISITOR\u H
#定义SHAPEVISITOR_H
#包括“Circle.h”
类形位器{
//类中的方法如下所示:
虚拟无效访问圆(圆*s)=0;
//其他同学
}
#恩迪夫
正如你们所看到的,圆包括形状,其中包括shapevisitor,它也包括圆


有什么想法吗

ShapeVisitor.h不需要包含Circle.h,一个前向声明
类Circle就可以了。函数声明不需要参数和返回类型的完整定义(即使返回/参数是按值的!)。只有函数的实现文件(在您的示例中为ShapeVisitor.cpp)需要包含Circle.h


赫伯·萨特(Herb Sutter)的这篇专栏文章(但仍然非常真实!)是一个很好的参考资料。

正如您所见。。。我一定是瞎了,我没看见。我看到的是没有包含,所以圆圈是未声明的。你的类定义需要分号。也许可以帮助你弄清楚里面发生了什么detail@artlessnoise“感谢您详细说明什么是远期声明,”他补充道。但是请注意,即使函数签名是
void visitCircle(圆圈s)
,也不需要标题!啊,好的,谢谢你的解释!我假设,在我的形状类中,我只需要一个“SeaveVistor”的前向声明,那么,DOCAHOLICIC是正确的,但是注意,圆。H需要包含Sh。h,因为派生类需要定义基类定义。抱歉,我用C++编程了一段时间。派生或合成。谢谢拉尔伯斯玛,这真的更有意义。如果可以的话,我会把你的答案投两次赞成票!