Russian Qt Forum
Май 12, 2024, 20:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Виртуальные функции в Qt  (Прочитано 7296 раз)
mwChief
Гость
« : Сентябрь 18, 2011, 23:50 »

Наткнулся на статью http://developer.qt.nokia.com/wiki/API_Design_Principles_Russia об api в Qt, которая оказалась для меня очень познавательной. Но часть про виртуальные функции понял не доконца, в частности этот момент:

Цитировать
Люди, внутри перегруженных функций, делают страшные вещи, например:
посылают события
посылают сигналы
повторно входят в цикл обработки событий (например, открывают диалог выбора файла)
удаляют объекты (что иногда приводит к “удалению this”)

С последним пунктом все вроде бы ясно, а вот предыдущие три не совсем. Может кто-то пояснит или отправить туда где об этом доходчиво написано? (можно на английском)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #1 : Сентябрь 19, 2011, 00:37 »

Вы кидаете сигнал из виртуалки, в слоте ваш объект удаляют, далее пункт последний.
Записан
mwChief
Гость
« Ответ #2 : Сентябрь 19, 2011, 00:54 »

А разве так может получится только с виртуальными функциями?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 19, 2011, 08:09 »

А разве так может получится только с виртуальными функциями?
Нет, и с невиртуальными тоже. Если удаление немедленное то надо аккуратно проверить что до выхода из ф-ции никаких обращение к (невалидному) this уже не будет
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Сентябрь 19, 2011, 09:26 »

Если удаление немедленное то надо аккуратно проверить что до выхода из ф-ции никаких обращение к (невалидному) this уже не будет
А из виртуальной оно будет в любом случае? Или в чём разница?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #5 : Сентябрь 19, 2011, 10:34 »

Разница в том что невиртуалку зовете вы сами и скорее всего в курсе что сигнал может кидаться не в конце ф-ии (как например у абстракт айтемвью даблклик кидается криво и лучше не трогать селекшн в его обработке).
В случае виртуалки ее зовет фреймворк, к-ый о наследниках не знает вообще ничего. И может быть сильно удивлен если после вызова безобидной ф-ии объекта вдруг резко не станет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 19, 2011, 10:37 »

А из виртуальной оно будет в любом случае? Или в чём разница?
Ну если в коде есть - то будет, иначе нет. Разницы никакой

В случае виртуалки ее зовет фреймворк, к-ый о наследниках не знает вообще ничего. И может быть сильно удивлен если после вызова безобидной ф-ии объекта вдруг резко не станет.
Понятно что за последствия удаления придется ответить
Записан
Akon
Гость
« Ответ #7 : Сентябрь 19, 2011, 21:58 »

Какой-то перевод кривой. Перегруженная функция - это другое. Имхо, имеется ввиду следующее:
Код:
void Foo::foo()
{
  doSomething()1;
  doSomething()2;
}
Если функции doSomething()1/2 невиртуальные, вся логика находится в пределах Foo. Если нет - кусок логики отдается наследникам, т.е. усложнение (не все в одном месте). Сигналы и события, выброшенные из наследников, делают логику еще менее очевидной.

То же сказал Авварон. 

« Последнее редактирование: Сентябрь 19, 2011, 22:01 от Akon » Записан
mwChief
Гость
« Ответ #8 : Сентябрь 19, 2011, 22:14 »

Т.е. проблема только в том что получается запутанный код с большой вероятностью ошибки?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.062 секунд. Запросов: 23.