LINUX.ORG.RU

Совершенно нубский вопрос по Qt и C++

 ,


0

3

Есть такое:

class A : public QWidget
{
    Q_OBJECT
    public:
        explicit  A(void);
        virtual  ~A(void);
    public:
        void x(void);
    private:
        Qwidget *w;
};
A::A(void)
    : QWidget(Q_NULLPTR)
{
    w = new QWidget(this);
}

A::~A(void)
{
}

void
x(void)
{
    w->something();
}
Не хочу создавать объект в куче посредством new. И не хочу делать в каждом методе (один метод «x» показан для примера, на деле их много) что-то типа «QWidget w(this); w.something();».

Вопрос: каким способом можно единожды создать виджет как «QWidget w(this)» чтобы он был доступен из всех методов?

static не катит, оно говорит: «QWidget: Must construct a QApplication before a QWidget. Aborted».

class A : public QWidget
{
    Q_OBJECT
    public:
        explicit  A();
        virtual  ~A();
    public:
        void x();
    private:
        Qwidget w;
};
A::A()
    : QWidget(Q_NULLPTR), w(this)
{
}

A::~A()
{
}

void
x()
{
    w.something();
}

P.S. (void) в плюсах эквивалентно () и «void» обычно не пишется.

xaizek ★★★★★
()
Ответ на: комментарий от RazrFalcon

С кучей extern «C» внутри моих файлов, это не бесполезно. Не значит что я внутри экстерна что-то плюсовое пишу, а значит что это просто единообразное написание внутри проекта.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Приходится. И так уже сгреб все экстерны в классы-обертки над С апи либ и таких оберток несколько.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от xaizek

Ахах!

Поменял на такую конструкцию в одном классе — хтоп показал что приложуха жрет теперь 187 мб вместо 145 мб по старому, плюс еще один тред создался...

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

С кучей разница должна быть в сторону уменьшения потребления памяти. А вот если раньше меньше объектов одновременно существовало, то может быть и больше. Меня вообще смутило, что объект можно создать, вызвать метод и выбросить (кстати можно делать так: QWidget(this).something();), может они должны где-то храниться вне объектов, которые их используют.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Да, похоже что так. Меня так же смутило что объект можно создать, попользовать и выкинуть. А потом, блин, опять создавать и выкидывать, и так еще сто раз во время работы. Позорище же.

Поэтому я и тред этот создал — хотел чтобы один раз и не в куче. В целом еще раз спасибо, т.к. сработало и помогло.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от xaizek

У меня не ++11, но, я еще не знаю что будет выбрано в итоге, и в этом еще нужно будет разобраться. Но если будет ++11, то еще и override всплывет. А на пока — главное что оно у меня на машине сейчас собирается и работает (дебиан 8), остальное пока не важно.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

о, главный «эксперт» подтянулся, совет ТС: не стоит воспринимать RazrFalcon всерьез и нужно в 5 раз тщательнее проверять любую информацию от него по С или С++. он неосилил, но учит

not_rj45
()
Ответ на: комментарий от deep-purple

С кучей extern «C» внутри моих файлов, это не бесполезно.

Даже имея внутри себя extern «C», файл всё ещё обрабатывается C++ компилятором, поэтому фишка про (void) против () всё ещё в силе.

i-rinat ★★★★★
()
Ответ на: комментарий от fluorite

В чём наглядность для c++?

Что то я не проснулся когда писал. Согласен - нах не надо.

golodranez ★★★★
()
Ответ на: комментарий от deep-purple

Ну давай прописные истины объяснять:

в C

  • foo(void) означает функцию без аргументов
  • foo() означает функцию с неопределённым числом аргументов неопределённого типа

в C++

  • foo(void) означает функцию без аргументов
  • foo() означает функцию без аргументов

Писать foo(void) в c++ не имеет смысла.

fluorite ★★★★★
()
Ответ на: комментарий от fluorite

не имеет смысла

Записи равнозначны, не запрещено использовать ни тот ни другой варианты.

Вот когда я буду работать с кодом, в котором уже написано без void, именно так я и буду делать. В этом же конкретном случае — как хочу, так и пишу. Код с самой первой строчки исключительно мой, и врядли кто-то еще будет в нем копаться, не потому, что я пишу как хочу, а потому, что интереса для прочих он не представляет никакого.

Реакция, твоя и выше отписавшихся, напоминает ситуацию как табщики на пробельщика накинулись (ну или наоборот).

deep-purple ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.