Реально ли самоуничтожение класса?
От: Аноним  
Дата: 29.01.04 07:59
Оценка:
Пример сабжа:

class A
{
  public:
    A() { _x = 10; } 
    void print() { cout << _x << endl; delete this; } 
    int _x;
};


int main()
{
    A* a = new A();
    a->print();
    return 0;
}
Re: Реально ли самоуничтожение класса?
От: Аноним  
Дата: 29.01.04 08:07
Оценка:
Вполне реально. Только не класса, а объекта класса. И как тебе понравится, например такое:
int main()
{
    A a;
    a.print();
}
Re[2]: Реально ли самоуничтожение класса?
От: Аноним  
Дата: 29.01.04 08:24
Оценка:
Здравствуйте, Аноним, Вы писали:

То то.
И что стандарт такое разрешает?
Мне кажется что первый примерчик работает из-за
случайных совпадений:
-Реализация компилятора
-Чистенькая не испорченная память.
В реальных проектах багов с памятью много,
и примерчик может завалить всю конструкцию.
Особенно в многопоточных приложениях.
Re[2]: Реально ли самоуничтожение класса?
От: MShura  
Дата: 29.01.04 08:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вполне реально. Только не класса, а объекта класса. И как тебе понравится, например такое:

А>
А>int main()
А>{
А>    A a;
А>    a.print();
А>}

А>


Лечится так:

class A
{
  A() { _x = 10; } 
  public:
    static A* Create() { return new A; }
    void print() { cout << _x << endl; delete this; } 
    int _x;
};
Re: Реально ли самоуничтожение класса?
От: Аноним  
Дата: 29.01.04 08:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пример сабжа:


#include <iostream>
#include <iomanip>

using std::cout;
using std::endl;

А>class A
А>{
А>  public:
А>    A() { _x = 10; } 
А>    void print() { cout << _x << endl; delete this; } 
А>    int _x;
А>};

А>int main()
А>{
А>    A* a = new A();
А>    a->print();
А>    return 0;
А>}

С этим кодом все в порядке.

См. http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.14
Re[3]: Реально ли самоуничтожение класса?
От: Lorenzo_LAMAS  
Дата: 29.01.04 08:41
Оценка: :))
MS>Лечится так:

MS>
MS>class A
MS>{
MS>  A() { _x = 10; } 
MS>  public:
MS>    static A* Create() { return new A; }
MS>    void print() { cout << _x << endl; delete this; } 
MS>    int _x;
MS>};
MS>


Так ты коновал какой-то
void g()
{
    A * pa = A::Create();
    A a(*pa);
    a.print();
}
Of course, the code must be complete enough to compile and link.
Re[4]: Реально ли самоуничтожение класса?
От: MShura  
Дата: 29.01.04 08:51
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

MS>>Лечится так:


MS>>
MS>>class A
MS>>{
MS>>  A() { _x = 10; } 
MS>>  public:
MS>>    static A* Create() { return new A; }
MS>>    void print() { cout << _x << endl; delete this; } 
MS>>    int _x;
MS>>};
MS>>


L_L>Так ты коновал какой-то

L_L>
L_L>void g()
L_L>{
L_L>    A * pa = A::Create();
L_L>    A a(*pa);
L_L>    a.print();
L_L>}
L_L>



Ну хорошо заведи конструктор копирования в private секции.
Вопрос был про delete this. Это обычная практика.
Re[5]: Реально ли самоуничтожение класса?
От: Bell Россия  
Дата: 29.01.04 08:55
Оценка: +1
Здравствуйте, MShura, Вы писали:


MS>Ну хорошо заведи конструктор копирования в private секции.


Ага, а потом кто-нибудь добавит новый конструктор в public-секцию

MS>Вопрос был про delete this. Это обычная практика.

ИМХО более обычная практика — помещение деструктора в private секцию.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Реально ли самоуничтожение класса?
От: Bell Россия  
Дата: 29.01.04 08:56
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>То то.

А>И что стандарт такое разрешает?
А>Мне кажется что первый примерчик работает из-за
А>случайных совпадений:

Первый пример легален.
Любите книгу — источник знаний (с) М.Горький
Re[6]: Реально ли самоуничтожение класса?
От: MShura  
Дата: 29.01.04 09:07
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, MShura, Вы писали:



MS>>Ну хорошо заведи конструктор копирования в private секции.


B>Ага, а потом кто-нибудь добавит новый конструктор в public-секцию


Это зависит от того, можно ли менять исходник или нет.

MS>>Вопрос был про delete this. Это обычная практика.

B>ИМХО более обычная практика — помещение деструктора в private секцию.

Согласен, что уж если завел функцию Create то желательно деструктор в private.
Re: Реально ли самоуничтожение класса?
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.01.04 09:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пример сабжа:


class A
{
  public:
    A() { _x = 10; } 
    void print() { cout << _x << endl; delete this; } 
    int _x;
};

Реально. Только не класса, а объекта.

Это что — реализация правил конспирации "после прочтения сжечь" ?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: Реально ли самоуничтожение класса?
От: WolfHound  
Дата: 29.01.04 09:21
Оценка:
Здравствуйте, Bell, Вы писали:

B>Первый пример легален.

+1 Объекты создаваемые динамически в моих программах только так себя и грохают. В том числе и в free-thread COM серверах...
... << RSDN@Home 1.1 beta 2 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Реально ли самоуничтожение класса?
От: mDok Украина  
Дата: 29.01.04 09:48
Оценка:
а auto_ptr для этой ситуации, не то?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.