2012-06-06 3 views
1

Представьте себе простой сегмент класса строки, которые это конструктор являются несколько объектов с точки класса:Переслать объявление и деструкторы

class Point ; 

class LineSegment { 
    public: 

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

Вопрос заключается в том, в деструкторе, я должен удалить пункты первой или это будет делать автоматически? На другими словами, в файле CPP, какие из следующих должно быть написано:

LineSegment::~LineSegment() 

или

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

Первый тоже будет работать. Это просто зависит от того, что вы хотите. Если «Point's» принадлежит кому-то другому (например, «std :: vector»), вы получите крах «позже не понимаете, почему он должен работать». Объявление класса не отображает 'Point' как членов класса, поэтому ... – Damon

+0

@Damon мы можем предположить, что они являются членами, и он просто их покинул. Как еще он мог называть их деструктором? –

+0

@LuchianGrigore: Хороший вопрос об объявлении. Хотя, конечно, это по-прежнему не обязательно означает, что класс фактически владеет указанными объектами «Point» (и, следовательно, им разрешено их удалять). Имея «точки» и «линии», очень эффективный и эффективный подход (подумайте об их трансформации, а не просто о распределении) заключается в том, чтобы хранить точки в массиве или векторе и ссылаться на них из объектов линии (не владея ими). – Damon

ответ

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 указатели в деструкторе.

Либо вариант вы ни выбрали, убедитесь, что документ ваше решение - то есть сделать это ясно, является ли класс предполагает владение указателей или нет.

У вас не возникло бы этой проблемы, если бы вы использовали умные указатели.

+0

Спасибо. Но кроме моей синтаксической ошибки, следует ли сначала удалить точки, или они автоматически удаляются, когда я удаляю объект линии? – Pouya

+0

@Pouya, если вы выделите их с помощью 'new' или' malloc', они не будут удалены автоматически. Но вопрос в том, что вы удаляете их вне класса в любом месте? Или класс имеет право собственности? Я думаю, вы либо не читали, либо не понимали моего ответа. –

2

Чтобы удалить их, вы должны использовать удаления оператора, таким образом:

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

Делать это будет вызывать деструктор P1 и P2

Единственный способ иметь точки удаляются автоматически будет будет иметь их значение в качестве члена класса:

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

делая это, когда LineSegment удаляется, P1 и P2 будут уничтожены автоматически.

+0

Не совсем, они могут быть умными указателями ... –

+0

@LuchianGrigore Да, но в этом случае точки не будут удаляться при вызове деструктора, они будут удалены, когда на них не будет более умных указателей. – Mesop

+0

И это плохо, потому что ...? Если несколько LineSegments содержат одни и те же точки, то это хорошо, тогда как использование объектов (например, в вашем коде) является расточительным с точки зрения памяти (вы дублируете одинаковые точки). –

Смежные вопросы