1

コンストラクターである単純なクラス線分が、クラスポイントからのオブジェクトのカップルであると想像してください。

class Point ;

class LineSegment {
    public:

      LineSegment(Point* P1, Point* P2);
      ~LineSegment();
} ;

問題は、デストラクタで、最初にポイントを削除する必要がありますか、それとも自動的に実行されますか?言い換えると、cppファイルには、次のうちどれを書き込む必要がありますか。

LineSegment::~LineSegment()

また

LineSegment::~LineSegment(){
     delete P1;
     delete P2;
}
4

2 に答える 2

4

まず、注意してください

LineSegment::~LineSegment(){
     ~P1();
     ~P2();
}

無効です。delete P1削除するには、とが必要ですdelete P2

P1また、誰が所有しているのかを把握しP2ます。それらがクラスによって所有されている場合は、デストラクタでそれらを削除しますが、オブジェクトが破棄された後は、外部からそれらにアクセスできないことに注意してください。

したがって、たとえば:

Point* p1 = new Point;
Point* p2 = new Point;

{
   LineSegment l(p1,p2);
}

delete p1;
delete p2;

deleteデストラクタのポインタを使用すると違法になります。

どちらのバージョンを選択する場合でも、必ず決定を文書化してください。つまり、クラスがポインタの所有権を引き継ぐかどうかを明確にします

スマートポインタを使用する場合、この問題は発生しません。

于 2012-06-06T08:52:54.753 に答える
2

それらを削除するには、次のように削除演算子を使用する必要があります。

LineSegment::~LineSegment(){
     delete P1;
     delete P2;
}

これを行うと、P1とP2のデストラクタが呼び出されます

ポイントを自動的に削除する唯一の方法は、クラスのメンバーとして値でポイントを取得することです。

class LineSegment {
protected:
    Point P1;
    Point P2;
public:
    /* constructors and destructors */
};

そうすることで、LineSegmentを削除すると、P1とP2が自動的に破棄されます。

于 2012-06-06T08:53:13.627 に答える