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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как достучаться до инстанса производного класса QGuiApplication?  (Прочитано 3996 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Февраль 20, 2018, 18:45 »

Для того, чтобы не таскать по всему приложению вытаскивание через extern глобальных объектов (всякие синглтоны с наборами конфигурирующих данных):

Код:
extern GlobalParameters globalParameters;
extern FixedParameters fixedParameters;
extern AppConfig appConfig;

... я решил сделать один объект (назовем его ядро) и все эти синглтоны поместить в него как включение.

Но это решение все равно будет требовать extern ядра в тех файлах, где нужны данные:

Код:
extern Core core;

Я решил сделать более правильно: надеясь на макрос qApp, я написал вот такой класс:

Код:
class App : public QGuiApplication
{
public:
    App(int &argc, char **argv);

    Core core; // Дополнительное поле, содержит ядро
};

И создаю приложение уже на основе такого класса:

Код:
App app(argc, argv);

Я думал, что к объекту core смогу обращаться в любом месте программы вот так:

Код:
qApp->core

Но нет, выяснилось, что макрос qApp возвращает тип QGuiApplication *, а у этого типа, естественно, нет поля core.

Вопрос: каким методом можно таскать по всему Qt-коду ссылку на ядро (не передавая его во все методы), и не помещая ядро в глобальную область видимости с последующим extern?

PS: qApp->instance тоже не помогает.
Записан

Собираю информацию по крупицам
http://webhamster.ru
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4724



Просмотр профиля WWW
« Ответ #1 : Февраль 20, 2018, 19:07 »

что мешает кастануть qApp к нужному типу?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Февраль 20, 2018, 22:43 »

Зачем использовать наследование от QGuiApplication, если в каждом TU где тебе нужно Core, ты всё равно должен будет включать хедер своего App (App.h)? Ты видимо хочешь чуда Улыбающийся Использовать класс, не декларируя его Улыбающийся Подключай хедер с декларацией Core (Core.h?) и сделай его классическим синглтоном тоже с геттером instance(), зачем ещё extern с глобальными переменными, что это за галимое Си?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Февраль 21, 2018, 05:05 »

Зачем использовать наследование от QGuiApplication, если в каждом TU где тебе нужно Core, ты всё равно должен будет включать хедер своего App (App.h)? Ты видимо хочешь чуда Улыбающийся Использовать класс, не декларируя его Улыбающийся Подключай хедер с декларацией Core (Core.h?) и сделай его классическим синглтоном тоже с геттером instance(), зачем ещё extern с глобальными переменными, что это за галимое Си?
Не согласен. Поместить globalParameters и др (возможно объединив в структуру Core) в свой App - смысл есть, эти данные смотрятся явно как члены наследника QGuiApp. Тогда зачем еще плодить синглтоны? Просто привести qApp
Код
C++ (Qt)
App * App::Instance( void )  // static
{
return dynamic_cast<App *> (qApp);
}
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Февраль 21, 2018, 12:55 »

Тогда зачем еще плодить синглтоны? Просто привести qApp
Код
C++ (Qt)
App * App::Instance( void )  // static
{
return dynamic_cast<App *> (qApp);
}

Зачем плодить синглтоны, ведь нужно создать ещё один синглтон и вызывать его ? Веселый

Сравним:

Код
C++ (Qt)
App * App::Instance( void )  // static
{
return dynamic_cast<App *> (qApp);
}
 
// usage
#include "App.h"
#include "Core.h"
App::Instance()->core->method();
 

и

Код
C++ (Qt)
Core * Core::instance()  // static
{
static Core core;
return &core;
}
 
// usage
#include "Core.h"
 
Core::instance()->method();
 

Для меня выбор очевиден
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #5 : Февраль 21, 2018, 13:18 »

Хозяйке на заметку: dynamic_cast - штука не бесплатная, это не static_cast.
Записан

Пока сам не сделаешь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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