11

我有 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

任何帮助表示赞赏!

4

3 回答 3

16

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

或者,从 中删除成员函数定义Line.h,并将它们放在单独的文件Line.cpp中,然后将 和 包含Point.hLine.h文件中。这是一种典型的依赖减少技术,可以使代码更快地编译,尽管可能会失去某些内联机会。

于 2013-04-04T22:06:33.333 回答
4

您已经前向声明Point,这对于声明指针或引用很好,但对于编译器需要知道前向声明类的定义的其他任何事情都不好。

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

于 2013-04-04T22:06:50.887 回答
0

为了扩展其他人给出的建议——一条线总是由两个端点定义的。将这些点定义为堆分配内存没有多大意义。为什么不让两点成为Line班级的常客呢?这将节省内存、提高性能并产生更简洁的代码。不过,您必须包括在内"Point.h"才能使其正常工作。

于 2013-04-04T23:04:27.017 回答