Форвард декларации и деструкторы
Представьте себе простой сегмент класса, который является его конструктором, это пара объектов из класса:
class Point ;
class LineSegment {
public:
LineSegment(Point* P1, Point* P2);
~LineSegment();
} ;
Вопрос в деструкторе: нужно ли сначала удалять точки или это будет сделано автоматически? Другими словами, в файле cpp, что из следующего должно быть записано:
LineSegment::~LineSegment()
или же
LineSegment::~LineSegment(){
delete P1;
delete P2;
}
2 ответа
Во-первых, обратите внимание, что
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
указатели в деструкторе.
Любая версия, которую вы выберете, обязательно документирует ваше решение - т.е. проясните, предполагает ли класс владение указателями или нет.
У вас не было бы этой проблемы, если бы вы использовали умные указатели.
Чтобы удалить их, вы должны использовать оператор удаления следующим образом:
LineSegment::~LineSegment(){
delete P1;
delete P2;
}
Это вызовет деструктор P1 и P2.
Единственный способ автоматически удалить точки - это получить их по значению в качестве члена класса:
class LineSegment {
protected:
Point P1;
Point P2;
public:
/* constructors and destructors */
};
При этом, когда LineSegment удаляется, P1 и P2 будут уничтожены автоматически.