С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
enter13
1 / 1 / 0
Регистрация: 22.02.2014
Сообщений: 112
1

Зачем в h файле прописывать другие классы до конструктора без директив препроцессора?

29.11.2017, 19:35. Просмотров 229. Ответов 13
Метки нет (Все метки)

Здравствуйте всем. Вопрос скорее всего (99%) очень глупый, толи я забыл чего, толи еще не знаю, вот читаю книгу Саммерфилда - Qt Профессиональное программирование, скачал код программ из книги, в примере вижу вот такое:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "pagedata.hpp"
#include <QDialog>
#include <QPrinter>
#include <QSet>
 
 
 
class QPageSetupDialog;
class QPrintPreviewDialog;
class QPushButton;
class QRadioButton;
class QTextDocument;
 
 
class MainWindow : public QDialog
{
    Q_OBJECT
вопрос собственно: зачем до конструктора прописывают классы типа: class QRadioButton чем это отличается от присоединения библиотеки директивой препроцессора #include? Далее в этом заголовочном файле как обычно используются методы или создаются указатели на объекты данных классов.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private:
    void createWidgets();
    void createLayout();
    void createConnections();
    void populateDocument(QTextDocument *document);
    bool paintPdfOrPs(const QString &filename);
    bool paintSvg(const QString &filename);
    bool paintImage(const QString &filename);
    bool exportPdfOrPs(const QString &filename,
                       QTextDocument *document);
    bool exportOdf(const QString &filename, QTextDocument *document);
    bool exportHtml(const QString &filename, QTextDocument *document);
    bool exportSvg(const QString &filename, QTextDocument *document);
    bool exportImage(const QString &filename, QTextDocument *document);
    bool suffixInSet(const QString &filename,
                     const QSet<QString> &suffixes);
 
    QRadioButton *painterRadioButton;
    QRadioButton *htmlRadioButton;
    QRadioButton *cursorRadioButton;
    QPushButton *pageSetupButton;
    QPushButton *printPreviewButton;
    QPushButton *printButton;
    QPushButton *exportButton;
    QPushButton *quitButton;
    QPageSetupDialog *pageSetupDialog;
    QPrintPreviewDialog *printPreviewDialog;
    QPrinter printer;
 
    PageData pageData;
Ранее такого в чужом коде не встречал.

 Комментарий модератора 
Название темы должно начинаться с большой буквы.
Правила именования тем и оформления сообщений в разделе Qt
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2017, 19:35
Ответы с готовыми решениями:

Подключение директив препроцессора
Не могу найти подходящую информацию=( Даны директивы : A) #include...

Использование директив препроцессора-С
Напишите программу на СИ. С помощью директивы #define вычислить X^3, при X =...

Массивы и директив препроцессора
Помогите доделать прогу. Эта прога выделяет два произвольных столбца в...

Использование директив препроцессора
Составить программу, использующую директивы препроцессора: с помощью...

Назначение директив препроцессора: #ifndef, #define, #endif
Объясните, что обозначают эти директивы? Заем это использовать в классах? ...

13
Wyn
1056 / 638 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
29.11.2017, 19:53 2
enter13, Данная вещь называется "предварительное объявление"(Forward declaration). Применяется либо для ускорения компиляции, либо для того, чтобы можно было использовать класс до его полного объявления.
1
enter13
1 / 1 / 0
Регистрация: 22.02.2014
Сообщений: 112
29.11.2017, 20:23  [ТС] 3
Хорошо почитаю, интересно если для ускорения компиляции, почему тогда все этим не пользуются?
0
Wyn
1056 / 638 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
29.11.2017, 20:39 4
enter13, в маленьких проектах, которые пишут на скорую руку, смысла в таких вещах нет. Там зависимостей немного, их можно легко обойти. Выигрыш во времени компиляции не заметен. Другое дело проекты из тысяч или десятков тысяч файлов. Там дерево зависимостей очень большое и его обход занимает очень много времени.
0
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
30.11.2017, 02:19 5
Цитата Сообщение от enter13 Посмотреть сообщение
интересно если для ускорения компиляции, почему тогда все этим не пользуются?
Это работает только если в описании класса используются указатели на тип предварительно объявленного класса, при использования объектов или методов, предварительно объявленного класса, это работать не будет.
0
enter13
1 / 1 / 0
Регистрация: 22.02.2014
Сообщений: 112
02.12.2017, 20:52  [ТС] 6
Цитата Сообщение от nd2 Посмотреть сообщение
Это работает только если в описании класса используются указатели на тип предварительно объявленного класса, при использования объектов или методов, предварительно объявленного класса, это работать не будет.
я так понял что если в h файле инициализированы эти указатели работать будет, а если в срр файле будут объекты созданы то работать не будет, поправьте если не прав
0
Байт
Эксперт C
19244 / 12366 / 2610
Регистрация: 24.12.2010
Сообщений: 25,486
02.12.2017, 21:41 7
enter13, Все проще некуда. Вот ты хочешь как член-данное класса А использовать нечто. Структуру, класс... Компилятор должен ВЫДЕЛИТЬ ПАМЯТЬ на это дело. А для этого ему нужно знать его описание. А можно в качестве данных класса А использовать УКАЗАТЕЛЬ. А указатель всегда, на что угодно, требует 4 байта (или 8). И он тебе (в классе А) место на указатель выделит. И в общем-то, ему плевать пока - на что. Потом разберемся.
0
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
03.12.2017, 01:03 8
Цитата Сообщение от enter13 Посмотреть сообщение
я так понял что если в h файле инициализированы эти указатели работать будет
Как ты их инициализировать будешь, если компилятор не видит ни самих классов, ни конструкторов классов?
0
enter13
1 / 1 / 0
Регистрация: 22.02.2014
Сообщений: 112
03.12.2017, 06:34  [ТС] 9
Цитата Сообщение от nd2 Посмотреть сообщение
Как ты их инициализировать будешь, если компилятор не видит ни самих классов, ни конструкторов классов?

тогда можно коротенький пример (псевдокод)
0
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
03.12.2017, 06:59 10
Цитата Сообщение от enter13 Посмотреть сообщение
тогда можно коротенький пример (псевдокод)
Пример чего?
0
enter13
1 / 1 / 0
Регистрация: 22.02.2014
Сообщений: 112
03.12.2017, 07:47  [ТС] 11
Цитата Сообщение от nd2 Посмотреть сообщение
описании класса используются указатели на тип предварительно объявленного класса
Вот этого
0
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
03.12.2017, 07:58 12
Цитата Сообщение от enter13 Посмотреть сообщение
Вот этого
Пример этого ты сам привёл, в первом посте.
0
enter13
1 / 1 / 0
Регистрация: 22.02.2014
Сообщений: 112
04.12.2017, 19:02  [ТС] 13
понятно
0
Горбаг
156 / 153 / 51
Регистрация: 25.09.2014
Сообщений: 775
Завершенные тесты: 2
05.12.2017, 09:41 14
enter13, еще только так и никак иначе ты сможешь сделать два разных взаимо-зависимых класса. Если просто включить один в другой и наоборот - будет взаимная зависимость и компилятор не сможет ее разрулить. А так - запросто.
1
05.12.2017, 09:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2017, 09:41

Вернуть значение типа int за счет директив препроцессора
основной текстовый документ. #include &quot;mystring.h&quot; #include &lt;iostream&gt; using...

Подсчитать сумму элементов заданного столбца матрицы (с использованием директив препроцессора)
вариант 1 Ввести в память машины массив размером N*M. Подсчитать сумму...

Можно пример практического применения в приложениях директив препроцессора #if,#end,#error
Просто говорится,что это для выборочной компиляции. Я не могу предсттавить,где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru