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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вложенные типы и опережающие описания  (Прочитано 4918 раз)
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, как поступили бы?
Записан
_OLEGator_
Гость
« Ответ #1 : Февраль 13, 2012, 09:13 »

Я называю это предобъявлением.
Вопрос по проектированию - цель создания зависимости от QSystemTrayIcon::ActivationReason и какая обработка в слоте?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


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


Просмотр профиля
« Ответ #2 : Февраль 13, 2012, 09:35 »

Вопрос по проектированию - цель создания зависимости от QSystemTrayIcon::ActivationReason и какая обработка в слоте?
Прицепить слот к сигналу QSystemTrayIcon::activated( QSystemTrayIcon::ActivationReason reason ) - очевидно же.
ActivationReason'ы очень разные, без параметра тут не обойтись.
Записан
Akon
Гость
« Ответ #3 : Февраль 13, 2012, 09:45 »

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

В идеале хотелось бы опережающее описание:
Код:
class QTrayNotifyIcon {
    enum ActivationReason;
}
В общем случае такого нет, отсюда и проблема.


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

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

Если же есть явная ЗАВИСИМОСТЬ одного типа от другого, в данном случае используются внутренние данные QSystemTrayIcon при объявлении метода, тогда однозначно только #include.
Записан
_OLEGator_
Гость
« Ответ #5 : Февраль 13, 2012, 10:14 »

to LisandreL:
я имел в виду проектирование и возможность вынести обработку в другое место.

Но все равно, это экономия на спичках получается.
Записан
andrew.k
Гость
« Ответ #6 : Февраль 13, 2012, 11:00 »

С такой ситуации в случае енумов, я использую int в методе вместо enum.
Не всегда правда.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


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


Просмотр профиля
« Ответ #7 : Февраль 13, 2012, 11:05 »

С такой ситуации в случае енумов, я использую int в методе вместо enum.
Не всегда правда.
Сигнал со слотом не сконнектятся при разных (пусть и приводимых) типах.
Записан
andrew.k
Гость
« Ответ #8 : Февраль 13, 2012, 11:08 »

С такой ситуации в случае енумов, я использую int в методе вместо enum.
Не всегда правда.
Сигнал со слотом не сконнектятся при разных (пусть и приводимых) типах.
Ну так, а зачем их делать разными? Подмигивающий
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


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


Просмотр профиля
« Ответ #9 : Февраль 13, 2012, 11:20 »

Ну так, а зачем их делать разными?
Потому, что вы это 2 постами выше предложили.  Смеющийся
Сигнал QSystemTrayIcon::activated( QSystemTrayIcon::ActivationReason reason ) нам достаётся вместе с Qt поэтому тип тут нам не изменить.
Вы говорите, что «С такой ситуации в случае енумов, я использую int в методе вместо enum.», но именно в такой, как указанно, ситуации int использовать нельзя, так как connect не сработает.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Февраль 13, 2012, 11:34 »

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

А все-таки как хорошо проектировать "идеальный код" (эх, живут же люди Улыбающийся)
Записан
andrew.k
Гость
« Ответ #11 : Февраль 13, 2012, 11:46 »

Ну так, а зачем их делать разными?
Потому, что вы это 2 постами выше предложили.  Смеющийся
Сигнал QSystemTrayIcon::activated( QSystemTrayIcon::ActivationReason reason ) нам достаётся вместе с Qt поэтому тип тут нам не изменить.
Вы говорите, что «С такой ситуации в случае енумов, я использую int в методе вместо enum.», но именно в такой, как указанно, ситуации int использовать нельзя, так как connect не сработает.
Я говорил не применительно к этому сигналу, а как способ избежать лишнего инклуда.
Иногда можно поступить так.
Вопрос в топике был "Если бы вы проектировали QSystemTrayIcon, как поступили бы?", а не вечный "что делать?"
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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