2012-06-06 43 views
1

想象的简单类线段,它的构造函数是夫妇从类点对象:向前声明和析构函数

class Point ; 

class LineSegment { 
    public: 

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

的问题是,在析构函数,我应该删除分排名第一,否则将自动完成?在换句话说,在cpp文件,以下哪些应该写成:

LineSegment::~LineSegment() 

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

第一个也会工作。这取决于你想要的。如果'Point'属于其他人(例如'std :: vector'),那么您将会遇到“不明白为什么,它必须工作”的类。类声明不会将'Point's显示为类成员,所以... – Damon

+0

@Damon我们可以假设他们是成员,他只是将它们排除在外。他怎么可能在析构函数中调用它们? –

+0

@LuchianGrigore:关于声明的好处。尽管当然它并不一定意味着这个类实际上拥有指向的Point对象(因此可以删除它们)。有了“点”和“线”,一个非常有效和高效的方法(考虑转换它们,而不仅仅是分配)是将点存储在数组或向量中,并从线对象(不拥有它们)引用它们。 – Damon

回答

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在析构函数指针是非法的。

您选择

任一版本,一定要文件你的决定 - 即说清楚是否这个类就假定指针的所有权或不

如果你使用智能指针,你就不会有这个问题。

+0

谢谢。但除了我的语法错误,我应该先删除点还是删除线对象时自动删除? – Pouya

+0

@Pouya如果你用'new'或'malloc'分配它们,它们不会被自动删除。但问题是 - 你是否在课外在课外将其删除?或者课堂是否拥有所有权?我在想你或者没有阅读或者不明白我的答案。 –

2

要删除它们,你必须使用delete运算符,这种方式:

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

否则,将调用P1的析构函数和P2

只有这样,才能有积分自动删除会由值它们作为类的成员:

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

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

+0

不是真的,他们可能是智能指针... –

+0

@LuchianGrigore是的,但在这种情况下,当析构函数被调用时,这些点将不会被删除,当它们没有更多智能指针时,它们将被删除。 – Mesop

+0

这很糟糕,因为...?如果多个LineSegments拥有相同的点,那么这是一件好事,而使用对象(如代码中)会浪费内存(您正在复制相同的点)。 –