Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

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

#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); };

Комментариев нет:

Отправить комментарий