我有一个基类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.
问题here会说从我的#include "Point.hpp"
声明中删除包含Point3D
。但是,这样做会导致相同的结果,我认为标题保护基本上会完成同样的事情。
我正在用clang编译。
答案 0 :(得分:6)
您不能从不完整的类型继承。您需要按如下方式构建代码:
class Point3D;
class Point
{
// ...
Point3D add(const Point &);
// ...
};
class Point3D: public Point
{
// ...
};
Point3D Point::add(const Point &)
{
// implementation
}
函数返回类型可能不完整,这就是Point
的类定义的原因。
我相信你可以弄清楚如何跨标题和源文件进行拆分。 (例如,前两部分可以放在Point.hpp
中,第三部分放在Point3D.hpp
中,其中包含Point.hpp
,最终的实现可以放在Point.cpp
中,其中包括Point.hpp
}和Point3D.hpp
。)