Point
で継承する基本クラスがありPoint3D
ます。ただし、何らかの理由でクラスPoint
は常にPoint3D
操作add
のために戻る必要があるため、インクルードに含めます。
これは私のクラスPoint
です:
#ifndef POINT_H
#define POINT_H
#include "Point3D.hpp"
class Point{
public:
Point(double, double, double);
void print() const;
Point3D add( const Point& );
protected:
double mX;
double mY;
double mZ;
};
#endif
私のクラスでは、最初に呼び出されるタイミングPoint3D
の定義にまだ遭遇していないことを知っているので(ヘッダーに含まれているため)、定義してから、使用する部分を定義します。Point
Point3D
Point
class Point;
Point
#ifndef POINT3D_H
#define POINT3D_H
#include <iostream>
#include "Point.hpp" // leads to the same error if ommitted
class Point;
class Point3D : public Point {
public:
Point3D(double, double, double);
void print() const ;
Point3D add(const Point&);
};
#endif
ただし、これは機能していません。コンパイルすると、次のエラーが発生します。
./tmp/Point3D.hpp:9:24: error: base class has incomplete type
class Point3D : public Point {
~~~~~~~^~~~~
./tmp/Point3D.hpp:7:7: note: forward declaration of 'Point'
class Point;
^
1 error generated.
ここでの質問は#include "Point.hpp"
、私のPoint3D
宣言からインクルードを削除することです。ただし、そうすることで同じ結果が得られ、ヘッダーガードは基本的に同じことを達成すると思います。
私はclangでコンパイルしています。