Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397

Избавление от includes в header файлах и последствия

30.05.2020, 21:36. Показов 663. Ответов 2

Студворк — интернет-сервис помощи студентам
Всем привет.

Пишу программу и ввиду того, что особо не задумывался, получилось так, что мои .h файлы включают в себя довольно большое количество #include. Хочу избавиться от них

Как структурировать приватные или защищённые переменные в классе? Сразу скажу, что кидать их (переменные) в cpp файл не хочу (хоть и согласен, что они являются частью имплементации и по сути должны бы, по хорошему, быть в cpp файлах, но меня от этого решения отталкивает невозможность потенциального полиморфизма (на функционал friend пофиг)), пускай остаются в хедерах

В общем, я знаю, что есть такая вещь как forward declaration. Эта вещь безусловно будет компилирорваться, но только при условии, что приватная (ну или защищенная) переменная будет типа указателя или ссылки

Меня бь это вполне устроило, если бы не одно "но". Сначала их было два, но я вроде бы как нашёл решение для первого. То первое "но" заключалось в том, как сохранить значение, если вдруг оно было возвращено вызванной публичной функцией из вне. Ведь, если мы возвращаем указатель, то его значение можно изменить в любой точке программы. Тут я понял, что могу использовать дескриптор const

Например у меня есть два класса: Person и Car
Вот один:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
class Car;
 
class Person
{
public:
    Person();
 
    const Car* GetCar();
protected:
    Car* car;
};
И вот второй:
C++ (Qt)
1
2
3
4
5
6
7
8
class Car
{
public:
    Car();
    Car(int cost);
 
    int cost;
};
Перед определением функции GetCar я указал const и дело в шляпе: мы получим значение и не сможем его изменить.

Но я всё-таки создаю этот пост ибо есть еще одно "но", о котором я упомянул выше. И оно заключается вот в чём: что, если мне нужен еще один конструктор класса Person, в который я бы мог передать экземпляр класса Car, чтобы записать это значение в приватное или защищённое поле этого класса. То есть вот так:
C++ (Qt)
1
Person(Car);
Как мне его передать? Если я передам просто экземпляр класса, то изменив значение из вне, изменится и значение и внутри класса, ведь там указатель

Если я передам его как указатель, то всё равно, изменив этот указатель где-нибудь снаружи, изменится и внутри класса тоже

Ага, может быть мне его передать как константу, вот так:
C++ (Qt)
1
Person(const Car*);
Такой трюк сработает только в том случае, если сама приватная переменная класса будет тоже помечена как const. Но это не подходит для меня совсем. Я хочу иметь возможность её изменять сколько мне душе угодно внутри этого класса

Какое решение этой проблемы вы мне посоветуете? Или может быть я вообще пошёл не тем путём и для того чтобы избавиться от includes в хедерах есть какое-то другое элегантное решение?

Заранее благодарю!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.05.2020, 21:36
Ответы с готовыми решениями:

Вывод Хедера ошибка Warning: include(./includes/header.php): failed to open stream: No such file or directory in W:\dom
Добрый день ! Помогите пожалуйста, хочу вывести в index хеадер сохранив кусок этого кода в другом файле а потом просто включить его но...

Ошибки в файлах шаблонах header.tpl, footer.tpl
При установке нового шаблона появились косяки, а именно появились ошибки в файлах шаблонах header.tpl, footer.tpl должен по дефолту...

Не работает strings.includes и пр
Туториал https://www.youtube.com/watch?v=NQ2i5cZ87ug&list=PLqKQF2ojwm3njNpksFCi8o-_c-9Vva_W0 где чувак црм делает на вуе и огнебазе. Прошел...

2
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
30.05.2020, 21:45
Цитата Сообщение от Pro100Tom Посмотреть сообщение
но меня от этого решения отталкивает блокировка потенциального полиморфизма)
Что это означает?

Добавлено через 3 минуты
Цитата Сообщение от Pro100Tom Посмотреть сообщение
избавиться от includes в хедерах
Идиома PIMPL. https://akhodakivskiy.github.i... ation.html
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.05.2020, 22:39
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Какое решение этой проблемы вы мне посоветуете?
пиши простой понятный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
 
#include "car.hpp"
 
class Person
{
public:
    Person(const Car& = {});
 
    const Car& GetCar() const noexcept;
    Car& GetCar() noexcept;
protected:
    Car m_car;
};
Цитата Сообщение от Pro100Tom Посмотреть сообщение
если мне нужен еще один конструктор класса Person, в который я бы мог передать экземпляр класса Car
что бы что-то куда-то передать, нужно что бы это "что-то" было доступно.

смысл прятать от вызывающей стороны класс Car,
если он все равно должен быть ей доступен?

рассмотрим код:

C++
1
2
3
4
5
6
7
#include "person.hpp"
 
int main()
{
    Car car;
    Person person(car);
}
если бы person.hpp не подтянул car.hpp,
этот код бы не скомпилировался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.05.2020, 22:39
Помогаю со студенческими работами здесь

C++ includes или как исправить ошибки
1>------ Построение начато: проект: mineserver, Конфигурация: Release Win32 ------ 1> chat.cpp 1>..\src\chat.cpp(326): warning C4244:...

Warning: Cannot modify header information - headers already sent в header('Location: /index.php');
Warning: Cannot modify header information - headers already sent by (output started at S:\home\localhost\www\new\cms\login.php:10) in...

Не могу создать 2 класса header-composition и header-social
При создании 2 классов. например header-composition и hedaer-social первый работает, а второй уже нет, его просто браузер не видит через...

Есть 2 файла. В файлах числа, найти самое большое число в обоих файлах
С++ Есть два файла В обоих файлах записаны слова Найти самое большое число в обоих файлах

Какая СУБД хранит данные в файлах с расширением .dat и индексы в файлах .k01, k02 и т.д.?
Какая СУБД хранит данные в файлах с расширением .dat и индексы в файлах .k01, k02 и т.д.? Есть ли возможность подключить эти таблицы в MS...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru