Форум программистов, компьютерный форум CyberForum.ru

Немного не понял описание классов - C++

Восстановить пароль Регистрация
 
Wurgengel
13 / 13 / 1
Регистрация: 23.02.2012
Сообщений: 66
16.08.2016, 09:05     Немного не понял описание классов #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
 
#include <QWidget>
#include <QSettings>
 
class QComboBox;
class QCheckBox;
class QTextEdit;
class QLabel;
 
class MyProgram : public QWidget {
    Q_OBJECT
private:
    QSettings m_settings;
    QComboBox* m_pcbo;
};
Что значит вот эти строки:
C++
1
2
3
4
class QComboBox;
class QCheckBox;
class QTextEdit;
class QLabel;
Почему нельзя было сразу подключить QtWidgets, где есть описание этих классов?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
16.08.2016, 09:16     Немного не понял описание классов #2
А если убрать?
DrOffset
6786 / 3997 / 917
Регистрация: 30.01.2014
Сообщений: 6,816
16.08.2016, 09:20     Немного не понял описание классов #3
Цитата Сообщение от Wurgengel Посмотреть сообщение
Что значит вот эти строки:
Предварительное объявление.

Цитата Сообщение от Wurgengel Посмотреть сообщение
Почему нельзя было сразу подключить QtWidgets, где есть описание этих классов?
Чтобы не захламлять пространство имен и не замедлять компиляцию. Конкретные заголовочные файлы подключаются в cpp, а в h оставляют предварительные объявления. Это хорошо работает в тех случаях, когда снаружи не требуется обращения к данным и функциям класса (работа с ними ведется внутри cpp).

Это общепринятый в Qt подход при организации проектов.
Wurgengel
13 / 13 / 1
Регистрация: 23.02.2012
Сообщений: 66
16.08.2016, 09:28  [ТС]     Немного не понял описание классов #4
Спасибо за объяснение.
nmcf
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
16.08.2016, 09:30     Немного не понял описание классов #5
DrOffset, как это ускорит компиляцию?
DrOffset
6786 / 3997 / 917
Регистрация: 30.01.2014
Сообщений: 6,816
16.08.2016, 10:47     Немного не понял описание классов #6
Цитата Сообщение от nmcf Посмотреть сообщение
как это ускорит компиляцию?
Ты серьезно?!

Допустим есть заголовочный файл А. Который реализует виджет AWidget. Он использует 10 стандартных виджетов. Если мы включаем заголовочные файлы этих 10ти виджетов в заголовочный файл А, а потом используем этот заголовочный файл еще в 20ти единицах трансляции в проекте, то мы получим включение всех 10 стандартных виджетов во все эти места (10*20 дополнительного исходного текста). Компилятору и препроцессору придется обрабатывать все эти включения, даже если они в реальности не нужны. А теперь распространим это на большой проект, скажем, в 500к строк и выше.

Поэтому в Qt предприняты меры (заголовочные файлы самой Qt повсеместно используют эту технику + паттерн pimpl), которые позволяют сокращать время компиляции в таких случаях. Если их придерживаться на постоянной основе, то можно получить достаточно серьезный выигрыш.
nmcf
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
16.08.2016, 11:52     Немного не понял описание классов #7
Приведённый пример неудачный. Не похоже, что его будут включать в 20 местах.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2274 / 990 / 226
Регистрация: 30.11.2013
Сообщений: 3,297
16.08.2016, 11:56     Немного не понял описание классов #8
Цитата Сообщение от DrOffset Посмотреть сообщение
Ты серьезно?!
Та же реакция)
Вот ссылка http://stackoverflow.com/questions/3...pilation-times
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2016, 12:10     Немного не понял описание классов
Еще ссылки по теме:

Действие конструктора вобще не понял C++
C++ Где пишется описание для выходного файла .exe (например описание процесса)
объясните задачу, ничего не понял C++
C++ Отделить описание шаблонных функций и классов от реализации
C++ Описание классов. Класс "Угол"

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

Или воспользуйтесь поиском по форуму:
DrOffset
6786 / 3997 / 917
Регистрация: 30.01.2014
Сообщений: 6,816
16.08.2016, 12:10     Немного не понял описание классов #9
Цитата Сообщение от nmcf Посмотреть сообщение
Приведённый пример неудачный. Не похоже, что его будут включать в 20 местах.
Мое объяснение не касалось примера ТС, я просто привел случай достаточно показательный, чтобы проиллюстрировать проблему лично тебе (эта проблема общая для любого проекта, не только Qt, из-за особенностей компиляции в С++). Поэтому мне твой вопрос показался странным. С насколько большимим и старыми проектами ты сталкивался?

Впрочем, это же только методология. Ты либо следуешь ей, либо нет. Проекты большими становятся не за один день же.
Допустим ты писал как придется, потому что считал, что проект не получится очень большим. Потом ты уволился, поступило дополнение ТЗ, потом еще одно. И вот, спустя 2 года, проект превратился в махину. Но мы не следовали методологии, поэтому нужен будет глобальный рефакторинг для ускорения компиляции и понижения связности модулей. Это цена, в общем-то, которую мы заплатим за запоздалые решения такого плана. Я много работал с такими проектами, и на своей шкуре прочувствовал цену мелких недочетов на раннем этапе, которые спустя годы превратились в огромные проблемы. Поэтому мне понятна задумка Qt-шников и я нахожу ее правильной, даже для маленьких задач.
Yandex
Объявления
16.08.2016, 12:10     Немного не понял описание классов
Ответ Создать тему
Опции темы

Текущее время: 03:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru