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

Alo*_*iel 8 c++ pointers destructor class

我有2个文件:

Point.h:

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

并且Line.h:

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

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

deletion of pointer to incomplete type 'Point'; no destructor called
Run Code Online (Sandbox Code Playgroud)

任何帮助赞赏!

Ker*_* SB 14

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

Alterntively,请从成员函数的定义Line.h,并把它们放在一个单独的文件Line.cpp,并且包括Point.hLine.h文件中.这是一种典型的依赖性减少技术,它使代码编译速度更快,但可能会丢失某些内联机会.

  • @vonbrand - 我的职业生涯大部分时间都在编写和维护图书馆并提供技术支持,我强烈反对.告诉用户他们必须在使用标题之前包含六个必备标题是一件令人头疼的事情,并且对实现者或用户没有任何好处. (7认同)
  • @vonbrand - 好的风格决定包括它.标题应该是自己编译的; 这样的神秘错误就少了. (3认同)

Ed *_* S. 5

您具有前向声明Point,这对于声明指针或引用来说很好,但对于编译器需要知道前向声明类的定义的其他任何东西来说就不好了。

如果您需要在头文件中进行前向声明(是吗?如果不需要,只需#include "Point.h"在 中),然后在实现文件中Line.h实现您的函数,该文件为.Line#includePoint.h