Определение классов qt

225
18 сентября 2018, 23:10

Изучаю qt и столкнулся с таким (обсолютно не понятным для меня) примером:

//headerfile.hpp
#include <QWidget>
#include <QStack>
//вопрос по эти двум стокам
class QLCDNumber;
class QPushButton;
...

Поясню: в хэдэре создается класс, унаследованный от QWidget (это понятно) и в нем используются классы QLCDNumber и QPushButton, но (судя по тому что выдает компилятор при проверке кода) эти классы не определены в QWidget и без указания этих классов (те две строки) код не скомпилировать. Ну или подключить QtWidgets. Почему так? Как это вообще работает?

Answer 1

Это называется forward declaration, по этому словосочетанию найдете полно информации. Вкратце: мы сообщаем компилятору что у нас где-то дальше будет использоваться класс с именем QLCDNumber, зачем это нужно? Могу сразу два варианта предложить:

  • Для сокрытия деталей реализации. Таким методом реализован шаблон-программирования PIMPL, т.е. в заголовочном файле виден только указатель на класс.
  • Для минимизации подключенных заголовков, что должно положительно повлиять на скорость компиляции программы.
Answer 2

forward declaration используется, если есть зависимости между классами. Например:

class b;
class a{
b bb;
public:
};
class b{
a aa;
public:
};

В этом примере в момент трансляции класса "b" класс "a" уже определен. Но в момент трансляции класса "a" класс "b" еще не определен. Чтобы сказать транслятору, что "b" это тоже класс и применяется forward declaration в виде строки class b;.

UPD1:

Более реалистичный пример для forward declaration:

class b;
class a{
b bb;
public:
};
class b{
public:
void fun1(a* aa);
};
READ ALSO
c++ stl: сортировка и копирование

c++ stl: сортировка и копирование

Подскажите пожалуйста, есть ли возможность средствами STL отсортировать вектор в новый вектор?

210
Java выводит already in use: bind, но порт не занят

Java выводит already in use: bind, но порт не занят

Выводит ошибку BindException: Address already in use: bind, хотя порт не занят

199
Объясните что такое JNDI подробно

Объясните что такое JNDI подробно

Что такое JNDI? Как я понял это api для получения EJB бинов, те

237
Как реализовать подобное?

Как реализовать подобное?

Есть множественный выбор в приложении androidНужно, чтобы программа выдавала среднее арифметическое выбранных пользователем позиций

196