Home

Advertisement

creaturen2t

> Recent Entries
> Archive
> Friends
> User Info

December 1st, 2009


03:43 pm - Явный вызов конструктора.
Вы когда-нибудь видели такое?
struct MyMegaStructure {
	int d;	
};

MyMegaStructure s = MyMegaStructure::MyMegaStructure();


Я вот сегодня увидел. Подивился. Я даже не знал, что так можно :)

(Leave a comment)

November 25th, 2009


10:54 pm - Работать кое-как или не работать совсем?
Одна из самых плохих черт QT — это чертово стремление «работать любой ценой».

Слот не соответствует сигналу? Ничего, я соберусь и запущусь, а потом тихонько напишу в консоль об этом. Конечно же, все это оценят. А консольное сообщение от оконного приложения — оно так бросается в глаза, что не заметить просто невозможно.

Нужны библиотеки для работы с SSL? Нет, я не буду требовать их при сборке программы, я лучше втихомолку подгружу их ручками во время выполнения с помощью функции LoadLibrary. А если не получится, я, опять же, расскажу всем в консоли о том, какие методы у меня unresolved.

Временами такое поведение меня просто бесит.

(1 comment | Leave a comment)

November 19th, 2009


11:16 am - Функтор в качестве обработчика сигнала в QT.
Вчера я несколько погорячился, написав, что в QT невозможно в качестве обработчика сигнала задать функтор.Немного подумав, я нашел колдовство, которое побеждает их черную магию и позволяет это делать.

Итак, проблема: научить QT обрабатывать сигналы с помощью произвольного функционального объекта, а не только строго определенного слота.
Решение: комбинация шаблонов и наследования.

Read more... )
Tags:

(Leave a comment)

November 18th, 2009


11:32 pm - QT: черная шаблонная магия.
QT — великолепная библиотека. Но не безупречная. Я уже писал о странном дизайнерском решении предоставить константную версию оператора QMap:: operator[], которая делает совершенно непонятные вещи. Сейчас же хочется сказать пару слов о сигналах и слотах в QT (это одна из главных отличительных особенностей библиотеки). Хотите знать, что это такое? Вам сюда.

Я, когда начинал это изучать, был удивлен реализацией. Специальный препроцессор? Обязательное наследование от QObject и какой-то магический макрос Q_OBJECT? Пф... Потом я нашел интересный документ, который называется так: «Почему в QT для реализации сигналов и слотов не используются шаблоны?». В общем-то, хорошо написано (хотя местами походит на извинения, особенно параграф «Code generators are good»). Но меня терзали смутные сомнения...

И вот я сегодня наткнулся:
qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError");
QObject::connect(p_socket, 
                 SIGNAL(error(QAbstractSocket::SocketError)), 
                 this, 
                 SLOT(handle_socket_error(QAbstractSocket::SocketError)));


Вкратце означает вот что: если сокету нехорошо, вызвать handle_socket_error.
Но без первой магической строчки оно ругается. Причем не во время компиляции. И программа даже не падает! Просто обиженно пишет на консоль:
QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketError'
(Make sure 'QAbstractSocket::SocketError' is registered using qRegisterMetaType().)

На консоль, GUI приложение. Это не так-то просто заметить. Причем, это стандартный класс (QTcpSocket), а не какая-то моя придумка.

Вот что такое истинная шаблонная магия. Когда от шаблонов отказываются, а потом их функциональность приделывают с помощью собственного кодогенератора. Только, в отличие от Александреску, это черная магия. Выглядит мерзко.

А еще, меня раздражает невозможность в качестве обработчика сигнала задать функтор. Зачем такие извращения? Об этом — как-нибудь потом.

(Leave a comment)


> Go to Top
LiveJournal.com

Advertisement