Здравствуйте, <Аноним>, Вы писали:
А>Привет!!!
А>Хотел спросить можна ли удалять обьект из внутри себя, безопасно ли это или правильно будут вызваны деструкторы обьекта то есть имееться ввиду что то типа такого:
А>
А>class A
А>{
А>private:
А>public:
А>A();
А>virtual ~A();
А>};
А>class B : public A
А>{
А>private:
А>public:
А>B();
А>void Delete();
А>vitual ~B();
А>};
А>//...
А>void B::Delete()
А>{
А>//...
А>delete this;//Можна ли так???
А>//Дальше нету обращений к обьекту...
А>};
А>
А>Спасибо!!!
Нет, так делать нельзя.
Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.
Здравствуйте, Аноним, Вы писали:
А>Привет!!!
А>Хотел спросить можна ли удалять обьект из внутри себя, безопасно ли это или правильно будут вызваны деструкторы обьекта то есть имееться ввиду что то типа такого:
А>
А>class A
А>{
А>private:
А>public:
А>A();
А>virtual ~A();
А>};
А>class B : public A
А>{
А>private:
А>public:
А>B();
А>void Delete();
А>vitual ~B();
А>};
А>//...
А>void B::Delete()
А>{
А>//...
А>delete this;//Можна ли так???
А>//Дальше нету обращений к обьекту...
А>};
А>
А зачем такие извраты? Цель какова? Может оно и не нужно вовсе? Или только спортивный интерес?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Удалить обьект из себя???
От:
Аноним
Дата:
21.09.04 14:32
Оценка:
Привет!!!
Хотел спросить можна ли удалять обьект из внутри себя, безопасно ли это или правильно будут вызваны деструкторы обьекта то есть имееться ввиду что то типа такого:
class A
{
private:
public:
A();
virtual ~A();
};
class B : public A
{
private:
public:
B();
void Delete();
vitual ~B();
};
//...void B::Delete()
{
//...delete this;//Можна ли так???
//Дальше нету обращений к обьекту...
};
Здравствуйте, Аноним, Вы писали:
А>Привет!!!
А>Хотел спросить можна ли удалять обьект из внутри себя, безопасно ли это или правильно будут вызваны деструкторы обьекта то есть имееться ввиду что то типа такого:
А>Спасибо!!!
Можно. в СОМ например объекты там и делают. то же самое для реализации коласса треда можно слделать типа пишем (new Thread()).Run() а в конце метода тред делает делет самое себя
Здравствуйте, prVovik, Вы писали:
V>Нет, так делать нельзя. V>Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.
И что, сам по себе защищенный деструктор убережет нас от создания объектов на стэке? А как насчет наследования?
ЗЫ
Если уж начал говорить о проблеме, то расскажи подробнее — что, и почему — как решается пробрема с оозданием и разркушением таких объектов, зачем и когда это нужно, и т.д.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Удалить обьект из себя???
От:
Аноним
Дата:
22.09.04 07:44
Оценка:
V>Нет, так делать нельзя. V>Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.
Интересный случай! То есть получаеться что деструктор вызветься дважды, получаеться что деструктор либо нужно сделать пустым или что бы он автоматически не вызывался... Об этом как то и не подумал... Спасибо!!!
Здравствуйте, Аноним, Вы писали:
V>>Нет, так делать нельзя. V>>Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.
А>Интересный случай! То есть получаеться что деструктор вызветься дважды, получаеться что деструктор либо нужно сделать пустым или что бы он автоматически не вызывался... Об этом как то и не подумал... Спасибо!!!
Дело не в этом, а в том, что this в этом случае не является указателем на участок памяти, выделенный с помощью new.
Соответственно применять к нему delete никак нельзя.
Здравствуйте, Аноним, Вы писали:
V>>Нет, так делать нельзя. V>>Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.
А>Интересный случай! То есть получаеться что деструктор вызветься дважды, получаеться что деструктор либо нужно сделать пустым или что бы он автоматически не вызывался... Об этом как то и не подумал... Спасибо!!!
Вот они, плоды недосказанности
Любите книгу — источник знаний (с) М.Горький
Re[4]: Удалить обьект из себя???
От:
Аноним
Дата:
23.09.04 11:21
Оценка:
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Аноним, Вы писали:
V>>>Нет, так делать нельзя. V>>>Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.
А>>Интересный случай! То есть получаеться что деструктор вызветься дважды, получаеться что деструктор либо нужно сделать пустым или что бы он автоматически не вызывался... Об этом как то и не подумал... Спасибо!!!
J>Дело не в этом, а в том, что this в этом случае не является указателем на участок памяти, выделенный с помощью new. J>Соответственно применять к нему delete никак нельзя.
А что если в обьект передать указатель который был получен через new и удалять его — так можно?
class A
{
private:
public:
A();
virtual ~A();
};
class B
{
private:
B* m_this;
public:
B(B* x_this);
void Delete();
virtual ~B();
};
B::B(B* x_this)
{
m_this=x_this;
}
void B::Delete()
{
if(m_this!=NULL)
{
delete m_this;
m_this=NULL;
};
}
B::~B()
{
if(m_this!=NULL)
{
//... то есть можна вызывать деструктор
}
}
Здравствуйте, prVovik, Вы писали: V>Нет, так делать нельзя. V>Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.
это легко обходится защищенным конструктором и фабрикой