Изучаю qt и столкнулся с таким (обсолютно не понятным для меня) примером:
//headerfile.hpp
#include <QWidget>
#include <QStack>
//вопрос по эти двум стокам
class QLCDNumber;
class QPushButton;
...
Поясню: в хэдэре создается класс, унаследованный от QWidget (это понятно) и в нем используются классы QLCDNumber и QPushButton, но (судя по тому что выдает компилятор при проверке кода) эти классы не определены в QWidget и без указания этих классов (те две строки) код не скомпилировать. Ну или подключить QtWidgets. Почему так? Как это вообще работает?
Это называется forward declaration, по этому словосочетанию найдете полно информации. Вкратце: мы сообщаем компилятору что у нас где-то дальше будет использоваться класс с именем QLCDNumber, зачем это нужно? Могу сразу два варианта предложить:
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);
};
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости