2

C++ プログラムにファイルをインクルードしようとしていますが、エラーが発生し続けます:

ShapeVisitor.h:9:28: error: ‘Circle’ has not been declared

問題は、クラスの構造が循環依存になることだと思います。これを解決するにはどうすればよいですか?

クラスヘッダーは以下のとおりです...

 //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 には shape が含まれており、これには shapevisitor が含まれており、これにも circle が含まれています。

何か案は?

4

1 に答える 1

5

ShapeVisitor.h に Circle.h を含める必要はありません。前方宣言で十分class Circle;です。関数宣言では、引数と戻り値の型を完全に定義する必要はありません (戻り値/引数が値による場合でも!)。関数の実装ファイル (あなたの場合: ShapeVisitor.cpp) だけに Circle.h を含める必要があります。

Herb Sutter によるこの昔ながらの(しかし今でも非常に真実です!) コラムは参考になります。

于 2013-03-30T23:30:13.923 に答える