Russian Qt Forum

Qt => Общие вопросы => Тема начата: mwChief от Сентябрь 18, 2011, 23:50



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

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

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


Название: Re: Виртуальные функции в Qt
Отправлено: Авварон от Сентябрь 19, 2011, 00:37
Вы кидаете сигнал из виртуалки, в слоте ваш объект удаляют, далее пункт последний.


Название: Re: Виртуальные функции в Qt
Отправлено: mwChief от Сентябрь 19, 2011, 00:54
А разве так может получится только с виртуальными функциями?


Название: Re: Виртуальные функции в Qt
Отправлено: Igors от Сентябрь 19, 2011, 08:09
А разве так может получится только с виртуальными функциями?
Нет, и с невиртуальными тоже. Если удаление немедленное то надо аккуратно проверить что до выхода из ф-ции никаких обращение к (невалидному) this уже не будет


Название: Re: Виртуальные функции в Qt
Отправлено: LisandreL от Сентябрь 19, 2011, 09:26
Если удаление немедленное то надо аккуратно проверить что до выхода из ф-ции никаких обращение к (невалидному) this уже не будет
А из виртуальной оно будет в любом случае? Или в чём разница?


Название: Re: Виртуальные функции в Qt
Отправлено: Авварон от Сентябрь 19, 2011, 10:34
Разница в том что невиртуалку зовете вы сами и скорее всего в курсе что сигнал может кидаться не в конце ф-ии (как например у абстракт айтемвью даблклик кидается криво и лучше не трогать селекшн в его обработке).
В случае виртуалки ее зовет фреймворк, к-ый о наследниках не знает вообще ничего. И может быть сильно удивлен если после вызова безобидной ф-ии объекта вдруг резко не станет.


Название: Re: Виртуальные функции в Qt
Отправлено: Igors от Сентябрь 19, 2011, 10:37
А из виртуальной оно будет в любом случае? Или в чём разница?
Ну если в коде есть - то будет, иначе нет. Разницы никакой

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


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

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



Название: Re: Виртуальные функции в Qt
Отправлено: mwChief от Сентябрь 19, 2011, 22:14
Т.е. проблема только в том что получается запутанный код с большой вероятностью ошибки?