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.hLine#includePoint.h

于 2013-04-04T22:06:50.887 に答える
0

他の人が提供した提案を少し拡張すると、線は常に 2 つの端点によって定義されます。これらのポイントをヒープ割り当てメモリとして定義しても意味がありません。Lineその2点をクラスのレギュラーメンバーにしてみませんか?これにより、メモリが節約され、パフォーマンスが向上し、コードがよりクリーンになります。ただし、これを機能させるには含める必要が"Point.h"あります。

于 2013-04-04T23:04:27.017 に答える