Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Polenoff
2 / 2 / 1
Регистрация: 26.09.2015
Сообщений: 84
#1

Предварительная декларация

20.04.2016, 15:25. Просмотров 678. Ответов 8
Метки нет (Все метки)

Как известно, подключать хидеры в хидеры нехорошо. Вместо этого рекомендуется использовать предварительную декларацию. Как использовать её с встроенными STL-классами?

C++
1
2
3
4
5
6
7
8
#include<vector> //нужно убрать и заменить на предварительную декларацию
template <typename T>
class MyClass
{
    std::vector <int> a;
    std::vector <std::string> b;
    std::vector <char> c;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2016, 15:25
Ответы с готовыми решениями:

декларация в классе
я хочу в класс добавить указатель на другой класс и получаю следующую ошибку:...

Декларация класса полинома
Как лучше задекларировать класс полинома n-ного порядка от m различных x с...

Декларация класса со статическим полем
Не сингелтон, а класс со статическим именно полем, а не экземпляром. Как это...

Предварительная обработка данных в архиваторе
Здравствуйте! Помогите, пожалуйста с делемой. Пишу архиватор, код...

Что такое forward декларация функции?
Вот в этом примере узнал об этом : struct S { static int i; S() ...

8
Kastaneda
Jesus loves me
Эксперт С++
4768 / 2971 / 342
Регистрация: 12.12.2009
Сообщений: 7,532
Записей в блоге: 2
Завершенные тесты: 1
20.04.2016, 15:27 #2
Цитата Сообщение от Polenoff Посмотреть сообщение
Как известно, подключать хидеры в хидеры нехорошо.
Цитата Сообщение от Polenoff Посмотреть сообщение
#include<vector> //нужно убрать и заменить на предварительную декларацию
глупость все это, не надо тут ничего менять.
0
hoggy
Заблокирован
20.04.2016, 19:21 #3
Лучший ответ Сообщение было отмечено Polenoff как решение

Решение

C++
1
2
// precompiled.cpp
#include "precompiled.h"
C++
1
2
3
4
5
6
7
// precompiled.h
 
// предварительно скомпилированный заголовок
 
#include <vector>
 
// здесь подключаем любые другие библиотеки

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//MyClass.h
 
// убрали
//#include<vector> 
 
// форвард декларация не нужна
// вместо неё вставляем маяк-напоминалку
#ifndef _VECTOR_
    #error #include <vector> first
#endif
 
// теперь, даже если мы забудем подключить vector к ед. трансляции
// препроцессор нам напомнит
 
template <typename T>
class MyClass
{
    std::vector <int> a;
    std::vector <std::string> b;
    std::vector <char> c;
}

C++
1
2
3
4
5
6
7
8
9
10
11
12
//MyClass.cpp
 
// первым делом подключаем 
// предварительно скомпилированный заголовок
// который содержит весь необходимый проекту STL 
 
#include "precompiled.h"   //<--- теперь std::vector виден
 
// далее подключаем наши хедера
 
#include "MyClass.h"  // <--- std::vector мы уже подключили
  // поэтому ошибки в хедере уже не будет
1
Polenoff
2 / 2 / 1
Регистрация: 26.09.2015
Сообщений: 84
20.04.2016, 19:59  [ТС] #4
Спасибо огромное!

А вы не могли бы прям пословно объяснить, что значит

C++
1
2
3
#ifndef _VECTOR_
    #error #include <vector> first
#endif
0
hoggy
Заблокирован
20.04.2016, 20:06 #5
Лучший ответ Сообщение было отмечено Polenoff как решение

Решение

Цитата Сообщение от Polenoff Посмотреть сообщение
#ifndef _VECTOR_
#error #include <vector> first
#endif

если дефайн _VECTOR_ не определен,
Кликните здесь для просмотра всего текста
(если никто нигде выше по тексту не сделал #include <vector>)

тогда показать пользователю сообщение об ошибке:
ошибка: в первую очередь подключите #include <vector>
1
Polenoff
2 / 2 / 1
Регистрация: 26.09.2015
Сообщений: 84
21.04.2016, 20:30  [ТС] #6
Цитата Сообщение от hoggy Посмотреть сообщение
#ifndef _VECTOR_
Что значит _VECTOR_ в этой строчке? Почему с нижними подчёркиваниями?

Добавлено через 17 минут
Это странно, но теперь он вообще компилирует без подключения #include<vector>
0
DrOffset
7597 / 4566 / 1106
Регистрация: 30.01.2014
Сообщений: 7,429
21.04.2016, 20:48 #7
Цитата Сообщение от Polenoff Посмотреть сообщение
теперь он вообще компилирует без подключения #include<vector>
Visual Studio поди?
Ну или, как вариант, заголовочный файл этот просто никуда не подключен.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4402 / 2377 / 657
Регистрация: 18.10.2014
Сообщений: 4,018
21.04.2016, 21:02 #8
Цитата Сообщение от Polenoff Посмотреть сообщение
Как известно, подключать хидеры в хидеры нехорошо.
Это откуда такое??? Наоборот, хидер должен быть самодостаточным, т.е. должен включаться в себя все хидеры, которые содержат необходимые ему объявления.

Надо только помнить, что наивное применение этого правила может привести к бессмысленному зацикленному включению хидеров. По этой причине хидеры лучше стратифицировать по условным уровням от низкого до высокого и следить за тем, чтобы хидеры включали в себя только хидеры более низкого уровня. А вот когда в хидере возникает обратная зависимость между объявлениями - вот тогда использовать предварительную декларацию.

При этом стандартные хидеры получают самый низкий уровень - их можно включать куда угодно.
0
Polenoff
2 / 2 / 1
Регистрация: 26.09.2015
Сообщений: 84
21.04.2016, 21:05  [ТС] #9
Цитата Сообщение от DrOffset Посмотреть сообщение
Visual Studio поди?
Ну да

Я правильно понимаю, что precompiled.h компилируется только один раз?
0
21.04.2016, 21:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2016, 21:05

Предварительная консультация по Wi-Fi
Дорогие форумчани, на работе дали задания сделать Wi-Fi… В универе я это еще...

БП: Декларация по ЕНВД
Бухгалтерия 2.0. Создается декларация по ЕНВД. В разделе 1 идет разбивка...

Декларация типа
Нашёл в книге одну непонятную декларацию: fmap:: (a-&gt;b) -&gt; f a -&gt; f b Так...


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

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

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