删除指向不完整类型'Point'的指针;没有破坏者叫

时间:2013-04-04 22:04:42

标签: c++ class pointers destructor

我有2个文件:

Point.h

class Point {
    int x;
    int y;
    char* name;
   public:
     Point() { name = new char[5]; }
    ~Point() { delete[] name; }
};

和:Line.h

class Point;
class Line {
    Point* p;
  public:
    Line() {
      p = new Point[2];
      ....
      ...
    }
    ~Line() {
       delete[] p;
    }
};

但是当我编译时,我得到了下一个错误:

deletion of pointer to incomplete type 'Point'; no destructor called

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:13)

您需要将#include "Point.h"添加到文件Line.h中。您只能构建和删除完整的类型。

另外,从Line.h中删除成员函数定义,并将它们放在单独的文件Line.cpp中,并在中包含Point.hLine.h 文件。这是一种典型的依赖性降低技术,可以使代码编译速度更快,但可能会丢失某些内联机会。

答案 1 :(得分:4)

你有前向声明的Point,这对于声明一个指针或引用很好,但是对于编译器需要知道前向声明类的定义的任何其他内容都没有问题。

如果您需要头文件中的前向声明(是吗?如果不是,只需#include "Point.h"中的Line.h),那么在{{1}的实现文件中实现Line函数} {s} #include

答案 2 :(得分:0)

为了扩展其他人给出的建议 - 一条线总是由两个端点定义。将这些点定义为堆分配的内存没有多大意义。为什么不将这两个点作为Line类的常规成员?这将节省内存,提高性能并导致更清晰的代码。但是,您必须包含"Point.h"才能使用此功能。