LINUX.ORG.RU

[C++/Qt] Чудеса с приведением типов


0

1

Имеется некий объект типа

class Model : public AbstractContactModel, при этом 

AbstractContactModel наследуется от QAbstractItemModel

потом этот указатель приводится к QObject'у и отдается дальше. И где-то позже делается вот так:

	object = ServiceManager::getByName("ContactModel");
	p->model = qobject_cast<AbstractContactModel*>(object);
	qDebug() << object << p->model << qobject_cast<QAbstractItemModel*>(object);

и получаем в результате

Core::SimpleContactList::Model(0x8dafa0) QObject(0x0)  Core::SimpleContactList::Model(0x8dafa0)

Что это за магия такая? Вроде все объекты на момент вызова полностью сконструированные. Но других идей у меня нету.

★★★★★

Ответ на: комментарий от namezys

> я написал 2 примера

ага, то я уже протупил, спасибо

aho
()
Ответ на: комментарий от namezys

cast'ы - вообще зло. Не зря отказались в С++ от приведения типов через скобки - чтобы сразу видно было, программист - обезьяна, писать программы не умеет.
Касты допустимы только:
1. Взаимодействии со старым (сишным) API.
2. Сильно генерализованных библиотеках.


Все прочие касты - в топку.

Vamp
()
Ответ на: комментарий от Vamp

Нет. Ну въелся. Если я его без блока кода написал, то и не компилил.

namezys ★★★★
()
Ответ на: комментарий от namezys

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

Vamp
()
Ответ на: комментарий от Vamp

Qt: QEvent для примера

у меня есть пара либ, в которых используется повыщающее преобразование из исключений, ибо исключение перехватывается внизу и транспортируется вверх или вбок.

Для примера: нужно зарегестрировать несколько обработчиков исключений, которые могут принимать исключения разного вида, а эти исключения ловятся в цикле обработке сообщений. Регистрация должна быть динамическая

namezys ★★★★
()
Ответ на: комментарий от namezys

QT: Я сказал - не обобщенные библиотеки и устралый код.

Пример твой я не понял, приведи код, пожалуйста.

Vamp
()
Ответ на: комментарий от Vamp

Код?

щас: http://dev.mdc.ru/browser/client/trunk/include/netstream/sequence

Тебе до понедельника без пояснений хватит разбирать.

А если коротко - это возможность объединять функи в некотором порядке, в котором они будут выполняться, при этом пробрасывать исключения между ними и, возможно, их обрабатывать. Зачем? Затем, что это позволяет писать полностью ассинхронный код не очень отлично от синхронного и скрыть все детали промежуточных вызовов. (man defer в twited).

Так вот. Для того, чтоб бросить исключение дальше, его надо поймать. Как? Желательно, по базовому типу. (откуда тже ты знаешь, какие типы исключения будут в этом месте выброшены).

namezys ★★★★
()
Ответ на: комментарий от andreyu

Мне еще конструктор написать, который не когда вызываться не будет?

namezys ★★★★
()
Ответ на: комментарий от namezys

Зачем же ловить исключение по базовому типу? Лови его в несколько попыток, сначала по самому верхнему - и так до самого низа. В чем трудность-то?

Vamp
()
Ответ на: комментарий от Vamp

В том, что ловить его можно только в одном месте. Вниз пустить ничего нельзя (внизу ничего нету). А обработчик его лежит в специальном массиве (точнее, первый из его обработчиков, который может послать его дальше)

namezys ★★★★
()
Ответ на: комментарий от namezys

Хотя да. Это очень обобщенная библиотека. Почти база всех наших проектов, благодаря которой все наши проекты работают ассинхронно с нашими серверами, и благодаря которой не в одном из мест (кроме маленького обработчика общения с сервером) не пришлось писать ассинхронный код

namezys ★★★★
()
Ответ на: комментарий от namezys

>Зачем? Затем, что это позволяет писать полностью ассинхронный код не очень отлично от синхронного и скрыть все детали промежуточных вызовов.

SEH нету, IOCP нету, ляликс == Шелезяка.

cnupm
()
Ответ на: комментарий от cnupm

Зачем все это?

Тем более в GUI'ом приложении на С++. Я посмотрю, как ты на IOCP будешь в одну модель писать данные, полученные из 500 маленьких запросов к серверу

namezys ★★★★
()
Ответ на: комментарий от namezys

>Зачем все это?

Щитоб не красноглазить лялексовом в дебаггере до 5 утра(seh) и не ловить косяки бздёвой kthreads+libevent (iocp).

cnupm
()
Ответ на: комментарий от namezys

> И почитать, как работает qt meta type и gcc

Читал. И? Мне лично неочевидно, почему проход по иерархии QMetaObject будет медленне, чем обращение к RTTI?

Тесты (например: http://lists.kde.org/?l=kde-optimize&m=113179073130021) показывают прямо противоположное.

reader
()
Ответ на: комментарий от reader

Хм. С ходу не нашел. МОжет так было раньше, но сейчас gcc не использует текстовые идентификаторы типов. А раньше было наоборот

namezys ★★★★
()
Ответ на: комментарий от cnupm

Канешн, умная винда сразу выдаст ошибку 100500 (которая может означать 20 разных ситуаций), и ты сразу всё без дебаггера поймёшь. Плавали - знаем.

Divius ★★
()
Ответ на: комментарий от Divius

Не зная броду - не суйся в воду, красноглазое отродье. GetLastError к SEH не имеет никакого отношения. И вообще, как, по втоему красноглазому мнению, связаны коды ашмпок и разматывание стека после исключения?

cnupm
()
Ответ на: комментарий от cnupm

Будем честны. Нафига тебе SEH, если ты пишешь на плюсах? SEH хорош, когда ты пишешь на C, в плюсах есть нормальные встроенные исключения.

Vamp
()
Ответ на: комментарий от Vamp

First - я не пишу на плюсах. Я пишу на сисярпе и сях с классами. Second - куда ты лезешь со ссвоим дилетантским мнением? У тебя что по исключениям в крестах, что по сеху знания нулевые.

cnupm
()
Ответ на: комментарий от cnupm

Хоспаде, старшие классы не закончили, а уже троллить лезут. Приходи, когда писать по русски научишься, убогий.

Коды ошибок должны хотя бы намекать на то, что произошло. А как волшебный SEH должен заменить дебаггер, умом не понять. У тех, у кого он есть, а не у тебя, я имею в виду.

Divius ★★
()
Ответ на: комментарий от namezys

Идея ясна, но пример не удачен.

1. ff f вызывает непонятно что, падение будет и без каста. Но не в этом суть - обсуждаются катсы.

2. B наследуется от А. Такое приведение делать нельзя. А наоборот - можно. Это написано в тех книгах о спп, которые даже я читал :)

Но в целом идея ясна.

nanoo_linux
()
Ответ на: комментарий от namezys

>Зачем все это?

Тем более в GUI'ом приложении на С++.


А зачем С++ для GUI-ёвого приложения? Нужны исключения? Юзайте C with exceptions http://www.c-with-exceptions.org http://www.lyngvig.org/A-Proposal-for-Exception-Handling-in-C.ashx

Есть реализация этого всего на tcc-exceptions http://tcc-exceptions.sourceforge.net/. Есть замена libc CWE http://sourceforge.net/p/cwe/git/ci/ddbfc474c062435a26611c217e87cdcd7c22ae4e/....

Далее прикручиваем к этому например, Vala и получаем «типа питон» и «типа С#» c исключениями (Vala правда, может вносить в зависимостей в рантайм glib; нужно допиливать Dova или POSIX профиль до нормальной поддержки Vala классов).

anonymous
()
Ответ на: комментарий от anonymous

Ага. А потом ищи это, чтоб и компилятор был, и нормальная библиотека для GUI

namezys ★★★★
()
Ответ на: комментарий от cnupm

То, на чем ты пишешь - это твои личные половые трудности. Хоть на лиспе пиши, мне-то что?
А вот что касается твоих оценок моих знаний - то их не худо бы обосновать. Иначе получается с твой стороны унылый слив.

Vamp
()
Ответ на: комментарий от nanoo_linux

Этакая очередная возможность «прострелить себе ногу» :)

nanoo_linux
()
Ответ на: комментарий от Vamp

>А вот что касается твоих оценок моих знаний

Твои знания оцениваются по твоим высказываниям (уровня 15 летнего пацанчика-красноглазика).

Иначе получается с твой стороны унылый слив.

Вставляй свечу @ Беги к врачу.

cnupm
()
Ответ на: комментарий от cnupm

Предлагаю тебе добавить конкретики. Какие высказывания, с чем несогласен. А то полемику ведешь, прямо скажем, на детсадовском уровне.

Vamp
()
Ответ на: комментарий от Vamp

Размазав слёзы, ребёнок сказал:

Предлагаю тебе добавить конкретики. Какие высказывания, с чем несогласен. А то полемику ведешь, прямо скажем, на детсадовском уровне.

Вот этой твой дилетантский высер, например:

SEH хорош, когда ты пишешь на C, в плюсах есть нормальные встроенные исключения.

Объясни разницу между плюсовыми исключениями и SEH, будь бобр, специалистишка ты наш :)

cnupm
()
Ответ на: комментарий от cnupm

А вот и не угадал. Я даже под грёбаную винду разрабатывал явно побольше некоторых (ох, и насколько же это труднее, чем под линукс, даже со всеми свистелками студии). По крайней мере, в отличие от тебя, я знаю, что такое отладчик.

Divius ★★
()
Ответ на: комментарий от Vamp

Что ты хочешь доказать школьнику, который считается, что перехват исключений делает ненужным отладчик?;)

Divius ★★
()
Ответ на: комментарий от Divius

>Я даже под грёбаную винду разрабатывал явно побольше некоторых

Лабу на поскале написал?

По крайней мере, в отличие от тебя, я знаю, что такое отладчик.

Ты лучше узнай, что такое seh, Герострат клоунообразный :)

cnupm
()
Ответ на: комментарий от cnupm

А вы то знаете?

Вот только без общих слов: как идет их обработка, как раскручивается стек. Какие языкоспецифичные вещи с этим связано. Как связана раскрутка стека вызова функций и раскрутка специфичных свойств функций в том же C++. Какова цена использования SEH при нормальном иполнении? Как помечаемая блок раскрутка стека: в фрейме или в рантайме?

namezys ★★★★
()

Let's srach begin!

anonymous
()
Ответ на: комментарий от cnupm

Возьми книжку и работай с книжкой. Там тебе объяснят разницу. Успехов.

Vamp
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.