Russian Qt Forum

Qt => Общие вопросы => Тема начата: xintrea от Февраль 20, 2018, 18:45



Название: Как достучаться до инстанса производного класса QGuiApplication?
Отправлено: xintrea от Февраль 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 тоже не помогает.


Название: Re: Как достучаться до инстанса производного класса QGuiApplication?
Отправлено: kambala от Февраль 20, 2018, 19:07
что мешает кастануть qApp к нужному типу?


Название: Re: Как достучаться до инстанса производного класса QGuiApplication?
Отправлено: Alex Custov от Февраль 20, 2018, 22:43
Зачем использовать наследование от QGuiApplication, если в каждом TU где тебе нужно Core, ты всё равно должен будет включать хедер своего App (App.h)? Ты видимо хочешь чуда :) Использовать класс, не декларируя его :) Подключай хедер с декларацией Core (Core.h?) и сделай его классическим синглтоном тоже с геттером instance(), зачем ещё extern с глобальными переменными, что это за галимое Си?


Название: Re: Как достучаться до инстанса производного класса QGuiApplication?
Отправлено: Igors от Февраль 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);
}


Название: Re: Как достучаться до инстанса производного класса QGuiApplication?
Отправлено: Alex Custov от Февраль 21, 2018, 12:55
Тогда зачем еще плодить синглтоны? Просто привести qApp
Код
C++ (Qt)
App * App::Instance( void )  // static
{
return dynamic_cast<App *> (qApp);
}

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

Сравним:

Код
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();
 

Для меня выбор очевиден


Название: Re: Как достучаться до инстанса производного класса QGuiApplication?
Отправлено: ViTech от Февраль 21, 2018, 13:18
Хозяйке на заметку: dynamic_cast - штука не бесплатная, это не static_cast.