基类具有不完整的类型

时间:2012-11-27 22:44:33

标签: c++ inheritance

我有一个基类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编译。

1 个答案:

答案 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。)