Russian Qt Forum

Qt => Общие вопросы => Тема начата: Akon от Февраль 13, 2012, 09:04



Название: Вложенные типы и опережающие описания
Отправлено: Akon от Февраль 13, 2012, 09:04
Дабы не плодить лишних зависимостей времени компиляции часто применяется опережающее описание (повсеместно используется в Qt).
Пример:
Код:
#include <QtGui/QMainWindow>

class QSystemTrayIcon;

class MainWindow : public QMainWindow
{
...
private:
QSystemTrayIcon* trayIcon_;
};
Здесь используется опережающее описание QSystemTrayIcon. Все бы ничего, но пусть требуется обработка сигнала QSystemTrayIcon::activated (QSystemTrayIcon::ActivationReason):
Код:
#include <QtGui/QMainWindow>
#include <QtGui/QSystemTrayIcon>  // подключается из-за QSystemTrayIcon::ActivationReason

class MainWindow : public QMainWindow
{
...
private:
QSystemTrayIcon* trayIcon_;
// коннетится к сигналу QSystemTrayIcon::activated (QSystemTrayIcon::ActivationReason)
Q_SLOT void iconActivated(QSystemTrayIcon::ActivationReason reason);
};
Поскольку появляется зависимость от вложенного перечисления QSystemTrayIcon::ActivationReason, опережающее описание больше не катит, и приходится подключать заголовок (опережающее описание вложенного типа в общем случае не сделаешь). Оно то может и не проблема, просто как-то выбивается из общей концепции. Если бы вы проектировали QSystemTrayIcon, как поступили бы?


Название: Re: Вложенные типы и опережающие описания
Отправлено: _OLEGator_ от Февраль 13, 2012, 09:13
Я называю это предобъявлением.
Вопрос по проектированию - цель создания зависимости от QSystemTrayIcon::ActivationReason и какая обработка в слоте?


Название: Re: Вложенные типы и опережающие описания
Отправлено: LisandreL от Февраль 13, 2012, 09:35
Вопрос по проектированию - цель создания зависимости от QSystemTrayIcon::ActivationReason и какая обработка в слоте?
Прицепить слот к сигналу QSystemTrayIcon::activated( QSystemTrayIcon::ActivationReason reason ) - очевидно же.
ActivationReason'ы очень разные, без параметра тут не обойтись.


Название: Re: Вложенные типы и опережающие описания
Отправлено: Akon от Февраль 13, 2012, 09:45
В идеале хотелось бы опережающее описание:
Код:
class QTrayNotifyIcon {
    enum ActivationReason;
}
В общем случае такого нет, отсюда и проблема.


Название: Re: Вложенные типы и опережающие описания
Отправлено: ssoft от Февраль 13, 2012, 10:08
В идеале хотелось бы опережающее описание:
Код:
class QTrayNotifyIcon {
    enum ActivationReason;
}
В общем случае такого нет, отсюда и проблема.


Никаких проблем в этом нет.
Здесь рассмотрены две разные архитектурные зависимости.

Предварительное объявление необходимо при ИСПОЛЬЗОВАНИИ НЕЗАВИСИМЫХ типов данных (1-й вариант).

Если же есть явная ЗАВИСИМОСТЬ одного типа от другого, в данном случае используются внутренние данные QSystemTrayIcon при объявлении метода, тогда однозначно только #include.


Название: Re: Вложенные типы и опережающие описания
Отправлено: _OLEGator_ от Февраль 13, 2012, 10:14
to LisandreL:
я имел в виду проектирование и возможность вынести обработку в другое место.

Но все равно, это экономия на спичках получается.


Название: Re: Вложенные типы и опережающие описания
Отправлено: andrew.k от Февраль 13, 2012, 11:00
С такой ситуации в случае енумов, я использую int в методе вместо enum.
Не всегда правда.


Название: Re: Вложенные типы и опережающие описания
Отправлено: LisandreL от Февраль 13, 2012, 11:05
С такой ситуации в случае енумов, я использую int в методе вместо enum.
Не всегда правда.
Сигнал со слотом не сконнектятся при разных (пусть и приводимых) типах.


Название: Re: Вложенные типы и опережающие описания
Отправлено: andrew.k от Февраль 13, 2012, 11:08
С такой ситуации в случае енумов, я использую int в методе вместо enum.
Не всегда правда.
Сигнал со слотом не сконнектятся при разных (пусть и приводимых) типах.
Ну так, а зачем их делать разными? ;)


Название: Re: Вложенные типы и опережающие описания
Отправлено: LisandreL от Февраль 13, 2012, 11:20
Ну так, а зачем их делать разными?
Потому, что вы это 2 постами выше предложили.  ;D
Сигнал QSystemTrayIcon::activated( QSystemTrayIcon::ActivationReason reason ) нам достаётся вместе с Qt поэтому тип тут нам не изменить.
Вы говорите, что «С такой ситуации в случае енумов, я использую int в методе вместо enum.», но именно в такой, как указанно, ситуации int использовать нельзя, так как connect не сработает.


Название: Re: Вложенные типы и опережающие описания
Отправлено: Igors от Февраль 13, 2012, 11:34
...Оно то может и не проблема, просто как-то выбивается из общей концепции.
Это также бывает когда хотелось бы inline в h файле. Не думаю что концепция здесь как-то нарушается. Вы используете конкретные подробности QSystemTrayIcon, стало быть пора от предварительного описания перейти к полному - это нормально.

А все-таки как хорошо проектировать "идеальный код" (эх, живут же люди :))


Название: Re: Вложенные типы и опережающие описания
Отправлено: andrew.k от Февраль 13, 2012, 11:46
Ну так, а зачем их делать разными?
Потому, что вы это 2 постами выше предложили.  ;D
Сигнал QSystemTrayIcon::activated( QSystemTrayIcon::ActivationReason reason ) нам достаётся вместе с Qt поэтому тип тут нам не изменить.
Вы говорите, что «С такой ситуации в случае енумов, я использую int в методе вместо enum.», но именно в такой, как указанно, ситуации int использовать нельзя, так как connect не сработает.
Я говорил не применительно к этому сигналу, а как способ избежать лишнего инклуда.
Иногда можно поступить так.
Вопрос в топике был "Если бы вы проектировали QSystemTrayIcon, как поступили бы?", а не вечный "что делать?"