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