Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Самоудаление объекта (delete this), или внешне? 
:(
    Опции темы
BabySG
Дата 4.10.2005, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 26.9.2005

Репутация: нет
Всего: нет



Собственно: имеется примерно такое

Код

class Base{
    virtual void a() { /* что-то там */ };
}

class Derived : public Base{
    virtual void a(){
       // Что-то там
       ABC::Destroy() ;                             // На самом деле, здесь стоит указатель на destroy() из класса АBC
       // ТОЧКА А
       Base::a();
   }
}

class ABC{
   void Destroy(){
       // ТОЧКА Б
   };
}



Так вот, стоит вопрос:
при выполнении определенных условий, объект класса Derived может захотеть удалиться.
Где это лучше сделать? В точке А или точке Б?

PS. В Derived::a() ОБЯЗАТЕЛЬНО в конце должна вызваться функция базового...



PM MAIL WWW   Вверх
__Sergey__
Дата 4.10.2005, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 21.1.2005

Репутация: нет
Всего: 4



Цитата(BabySG @ 4.10.2005, 22:00)
объект ... может захотеть

я балдею!
когда это было, чтобы объект действовал "по своему усмотрению", а не так как его
запрограммировали.
или я чего-то не понял, или формулируй вопрос правильно smile
а вообще-то весьма жутковатая схема построения классов ;)

Это сообщение отредактировал(а) __Sergey__ - 4.10.2005, 23:28
PM MAIL   Вверх
np9mi7
Дата 5.10.2005, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Попытка удаление самого себя - ошибка проектирования;

Лучше напиши некое подобие владельца объекта, который бы смотрел на то чем владеет и принимал решение об удалении;

Вообще не понятен кусок кода:
Код

ABC::Destroy();
, ABC не базовый для Derived, да и функция не статическая. Что ты имел ввиду?


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Mayk
Дата 5.10.2005, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Чур меня чур. Точка А в данном контексте эквивалентна точке Б.
А вообще ничего, что после освобождения состояние памяти будет неопределено и вызов Base::a() может закончится крахом?


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
BabySG
Дата 5.10.2005, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 26.9.2005

Репутация: нет
Всего: нет



Цитата(Mayk @ 5.10.2005, 06:53)
Чур меня чур. Точка А в данном контексте эквивалентна точке Б.
А вообще ничего, что после освобождения состояние памяти будет неопределено и вызов Base::a() может закончится крахом?

http://forum.vingrad.ru/index.php?showtopi...&hl=delete+this
Добавлено @ 07:57
Цитата(__Sergey__ @ 4.10.2005, 23:26)
Цитата(BabySG @ 4.10.2005, 22:00)
объект ... может захотеть

я балдею!
когда это было, чтобы объект действовал "по своему усмотрению", а не так как его
запрограммировали.
или я чего-то не понял, или формулируй вопрос правильно smile
а вообще-то весьма жутковатая схема построения классов ;)

К примеру - есть окно, при нажатии на кнопку закрытия окна окно должно закрыться.

PM MAIL WWW   Вверх
np9mi7
Дата 5.10.2005, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Цитата
К примеру - есть окно, при нажатии на кнопку закрытия окна окно должно закрыться.
, так и закрывай его а не убивай......


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
BabySG
Дата 5.10.2005, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 26.9.2005

Репутация: нет
Всего: нет



Цитата(np9mi7 @ 5.10.2005, 00:12)
Попытка удаление самого себя - ошибка проектирования;

Лучше напиши некое подобие владельца объекта, который бы смотрел на то чем владеет и принимал решение об удалении;

Вообще не понятен кусок кода:
Код

ABC::Destroy();
, ABC не базовый для Derived, да и функция не статическая. Что ты имел ввиду?

См. мой ответ по поводу владельца выше.
А насчет ABC::destroy()
Выглядит на самом деле так:

Код


(((Base*) objPtr)->*methodPtr)();



Рассматривался вопрос недалеко тут в форуме...
Добавлено @ 08:01
Цитата(np9mi7 @ 5.10.2005, 07:59)
Цитата
К примеру - есть окно, при нажатии на кнопку закрытия окна окно должно закрыться.
, так и закрывай его а не убивай......

В данном случае равнозначно удалению.

Нужно освободить память - так как таких окон много.
PM MAIL WWW   Вверх
Mayk
Дата 5.10.2005, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(BabySG @ 5.10.2005, 11:56)

http://forum.vingrad.ru/index.php?showtopi...&hl=delete+this

google.com. мы будем обсуждать вопрос или раскидываться ссылками без объяснений что к чему?
Смотрим по данной ссылке:
Цитата(chipset @ 30.5.2005, 08:14)
class foo
{
    public:
    int a;
int    delete_it()
{
    a = 7;
    cout<<"Before "<<a<<endl;
    delete this;
    a = 2;
    cout<<"After "<<a<<endl;
    return 2;
}
};
- скомпилировалось и запустилось и созданное на стёке и в куче.
Только вот результат был:
Цитата
Before 7
After 0


Base::a() обратится к какой-нить ф-ции из виртальной таблицы и "здравствуй дебагер"
Цитата(BabySG @ 5.10.2005, 11:59)
Нужно освободить память - так как таких окон много.

Ну так освобождай в конце ф-ции. После вызовы base::a,
или вне ф-ции.

Это сообщение отредактировал(а) Mayk - 5.10.2005, 08:25


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
BabySG
Дата 5.10.2005, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 26.9.2005

Репутация: нет
Всего: нет



Цитата(Mayk @ 5.10.2005, 08:22)

Цитата(BabySG @ 5.10.2005, )

http://forum.vingrad.ru/index.php?showtopi...&hl=delete+this

google.com. мы будем обсуждать вопрос или раскидываться ссылками без объяснений что к чему?
Смотрим по данной ссылке:

[...SKIP...]

Base::a() обратится к какой-нить ф-ции из виртальной таблицы и "здравствуй дебагер"


Никаких обид - текст порезался после ссылки.
Привёл её к тому, что в варианте с членами-данными может еще прокатит.
Вот и интересно стало - что насчет функций.


Цитата(Mayk @ 5.10.2005, 08:22)

Цитата(BabySG @ 5.10.2005, )
Нужно освободить память - так как таких окон много.

Ну так освобождай в конце ф-ции. После вызовы base::a,
или вне ф-ции.

так в том-то и вопрос, что base::a должно быть последней строкой.
Т.е. нужен вариант, а-ля:
Код

   delete this;
   Base::a;


, а вот так не катит:
Код

   Base::a;
   delete this;


PM MAIL WWW   Вверх
Mayk
Дата 5.10.2005, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(BabySG @ 5.10.2005, 19:13)
delete this;
  Base::a;

Дык это тоже не катат, если нет гарантии, что base::a не обращается к данным/vtable.
Прога (если повезет) просто вылетит(ибо состояние памяти не определено).
Код

struct A
{       int a;
        A(){a=657;}
        void f(){delete this; cout << a << endl;    }
};
int main(int argc, char** argv)
{
        A* a = new A;
        a->f();
}

вот это выдает 0, а не 657.

Что делает Base::A? Почему он должен вызываться после delete? Ведь после delete объекта уже нет.
А такой вариант не пойдёт smile
Код

    virtual void a(){
       ABC::Destroy() ;
       Derived::~Derived();
       Base::a();
       delete this;
   }

Выглядит надо сказать уродски.







--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
BabySG
Дата 5.10.2005, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 26.9.2005

Репутация: нет
Всего: нет



smile Практически так же для проверки накатал smile

Решил я проблемку. В итоге получилось (на пальцах) примерно так:

В ABC::Destroy() объект, который хочет удалиться, ставиться на пометку в очередь таких же.
По окончанию обработки "окон", просматривается сия очередь и удаляется в тартары все из нее.
В итоге: объект будет правильно удален и можно вызвать ф-ию базового класса.

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

PPS. Спасибо за участие!
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.