前向声明和析构函数

时间:2012-06-06 08:50:34

标签: c++ oop destructor forward-declaration

想象一下简单的类线段,它的构造函数是来自类点的几个对象:

class Point ;

class LineSegment {
    public:

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

问题是,在析构函数中,我应该先删除这些点还是自动完成?换句话说,在cpp文件中,应该写下以下哪一项:

LineSegment::~LineSegment()

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

2 个答案:

答案 0 :(得分:4)

首先,请注意

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

无效。要删除,您需要delete P1delete P2

另外,找出谁拥有P1P2。如果它们属于类,则在析构函数中删除它们,但请注意,在对象被销毁后,您将无法在外部访问它们。

所以,例如:

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

{
   LineSegment l(p1,p2);
}

delete p1;
delete p2;

如果你delete析构函数中的指针,那将是非法的。

您选择的任何一个版本,请务必记录您的决定 - 即明确该类是否承担指针的所有权

如果您使用智能指针,则不会出现此问题。

答案 1 :(得分:2)

要删除它们,您必须使用delete运算符:

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

这样做会调用P1和P2的析构函数

自动删除点的唯一方法是按值将它们作为类的成员:

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

通过这样做,当LineSegment被删除时,P1和P2将被自动销毁。

相关问题