Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Undisputed
217 / 145 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
1

Использование указателей на контейнеры STL в заголовочных файлах

26.02.2017, 19:46. Просмотров 762. Ответов 50
Метки нет (Все метки)

Для использования указателей на I/O классы достаточно включить <iosfwd> который содержит опережающие объявления и таким образом появляется возможность объявить указатель например на stringstream в заголовочном файле
C++
1
2
3
4
//some.h
#include <iosfwd>
 
void bar(std::stringstream *s);
а как быть если хочется объявить указатель в заголовочном файле например на std::map<T,T> или std::string?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2017, 19:46
Ответы с готовыми решениями:

Про добавление заголовочных файлов в заголовочных файлах
В который раз эта вещь засовывает мозги в блендер! Я про то, что не могу...

Использование STL в DLL-файлах
Хочу использовать библиотеку STL в своем DLL-проекте. В частности для...

О стандартных заголовочных файлах
Не знаю в какую категорию отнести данное нубство, но все же: Часто использую...

Массивы в заголовочных файлах
в заголовочном файле в описании класса пишу: int _const_iMas =...

Контейнеры STL
Кто знает где найти информацию по поводу стандартных контейнеров STL?...

50
nmcf
6514 / 5743 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
26.02.2017, 20:06 2
А почему не использовать нормальные заголовки?
0
Undisputed
217 / 145 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
26.02.2017, 20:08  [ТС] 3
Цитата Сообщение от nmcf Посмотреть сообщение
А почему не использовать нормальные заголовки?
Нормальные - это какие? Просто я не понял что не так
0
nmcf
6514 / 5743 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
26.02.2017, 20:10 4
Ну нужен map, подключай <map>.
0
Undisputed
217 / 145 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
26.02.2017, 20:22  [ТС] 5
nmcf,
Ну в нем реализация ведь сидит. А что если у меня в двух хедерах сидит map которые подключаются в один файл? Это разве не приведет к ошибке компиляции?

Добавлено через 10 минут
Пока думаю в файле с кодом в начале подключать map а за ним хедера. Это нормальное решение?
0
nmcf
6514 / 5743 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
26.02.2017, 20:24 6
Откуда ты взял, что они мешают компиляции?
0
Undisputed
217 / 145 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
26.02.2017, 20:36  [ТС] 7
Цитата Сообщение от nmcf Посмотреть сообщение
Откуда ты взял, что они мешают компиляции?
Ну учитывая что для потоковых классов есть файл с опережающими определениями, я предполагал что аналогичное должно быть и для остальных классов STL. Это не так?
Если нет, то зачем тогда придумали iosfwd? Чем объясняется такая избирательность?

Мне интересно, если включать map во всех хедерах и это не приводит к ошибке компиляции, то как это работает?
Там сидят объявления? А потом достаточно 1 раз подцепить файл реализации map? Вот это мне не понятно...
0
nmcf
6514 / 5743 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
26.02.2017, 20:48 8
Лучший ответ Сообщение было отмечено Undisputed как решение

Решение

Где-то были рассуждения, что эти опережающие ускоряют компиляцию.
Ну там же везде проверки вставляют на многократное подключение.
1
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
26.02.2017, 21:05 9
Цитата Сообщение от sys_beginner Посмотреть сообщение
Там сидят объявления?
Там сидят шаблоны.
0
Undisputed
217 / 145 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
26.02.2017, 21:17  [ТС] 10
Цитата Сообщение от nmcf Посмотреть сообщение
Ну там же везде проверки вставляют на многократное подключение.
Ясно, спасибо. Но что плохо - в каждой единице трансляции будет дублирование этот map-а. Соответственно кода будет больше.

Цитата Сообщение от nd2 Посмотреть сообщение
Там сидят шаблоны.
В смысле?

Добавлено через 8 минут
nmcf,
Меня вот еще что волнует... Насколько я понимаю получается что в каждой единице трансляции в которой используется этот map будет его дублирование т.к все файлы компилируются отдельно. А можно ли как то этого избежать?
0
tapochka
40 / 40 / 17
Регистрация: 25.04.2014
Сообщений: 499
26.02.2017, 21:18 11
sys_beginner, ну у вас в каждом хедере же #ifndef стоит... второй раз если подключить файл, то #ifndef уже не пропускает... https://ru.wikipedia.org/wiki/Include_guard
0
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
26.02.2017, 21:22 12
Цитата Сообщение от sys_beginner Посмотреть сообщение
В смысле?
В том смысле, что там могут быть и реализации, но шаблонов.
1
Undisputed
217 / 145 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
26.02.2017, 21:57  [ТС] 13
Цитата Сообщение от tapochka Посмотреть сообщение
ну у вас в каждом хедере же #ifndef стоит.
У меня - нет.

Цитата Сообщение от nd2 Посмотреть сообщение
В том смысле, что там могут быть и реализации, но шаблонов.
То есть вы имеете ввиду что то типа такого?
C++
1
2
3
4
struct map
{
    void insert();
};
А вот nmcf говорит что там все таки сидит полная реализация которая окутана в проверку был ли уже подключен этот файл.
Меня в первую очередь интересует как сделать так, что бы реализация map не дублировалась на каждую единицу трансляции в которой она используется (или этого не происходит?). Хочется получить более менее развернутый ответ по этому поводу. Вроде бы вопрос не сложный...
0
nmcf
6514 / 5743 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
26.02.2017, 22:02 14
Цитата Сообщение от sys_beginner Посмотреть сообщение
У меня - нет.
И вот это неправильно, если речь о твоих h, а в стандартных есть.

Добавлено через 46 секунд
Просто подключай map везде, где нужно и всё.
1
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
26.02.2017, 22:03 15
Цитата Сообщение от sys_beginner Посмотреть сообщение
То есть вы имеете ввиду что то типа такого?
Где здесь шаблон?
Цитата Сообщение от sys_beginner Посмотреть сообщение
А вот nmcf говорит что там все таки сидит полная реализация которая окутана в проверку был ли уже подключен этот файл.
Сам заглянуть в <map> никак не можешь?
Цитата Сообщение от sys_beginner Посмотреть сообщение
как сделать так, что бы реализация map не дублировалась на каждую единицу трансляции в которой она используется (или этого не происходит?).
Там шаблоны, поэтому присутствие их в нескольких единицах трансляции не вызовет ошибки множественных определений, а от множественных включений, в одну единицу трансляции, там стоит защита:
C++
1
2
3
4
5
6
// map standard header
#pragma once
#ifndef _MAP_
#define _MAP_
//...
#endif /* _MAP_ */
0
Undisputed
217 / 145 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
26.02.2017, 22:17  [ТС] 16
Цитата Сообщение от nd2 Посмотреть сообщение
Где здесь шаблон?
Шаблон в том смысле, как вот бывают шаблоны функций...
Цитата Сообщение от nd2 Посмотреть сообщение
Сам заглянуть в <map> никак не можешь?
Где глянуть? GCC вроде на плюсах а в остальных - хз как понимать исходник
Цитата Сообщение от nd2 Посмотреть сообщение
Там шаблоны, поэтому присутствие их в нескольких единицах трансляции не вызовет ошибки множественных определений
Не понимаю о каких шаблонах идет речь. Если о template<> то какое это имеет отношение к подключению файлов?
Цитата Сообщение от nd2 Посмотреть сообщение
а от множественных включений, в одну единицу трансляции, там стоит защита:
Так последний вопрос был совсем не об этом.
0
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
26.02.2017, 22:42 17
Цитата Сообщение от sys_beginner Посмотреть сообщение
Где глянуть?
В заголовочном файле <map>.
Цитата Сообщение от sys_beginner Посмотреть сообщение
Не понимаю о каких шаблонах идет речь. Если о template
В С++ есть ещё какие-то шаблоны?
Цитата Сообщение от sys_beginner Посмотреть сообщение
какое это имеет отношение к подключению файлов?
К подключению <map> имеет прямое, потому что в нём шаблоны, и не только объявления.
Цитата Сообщение от sys_beginner Посмотреть сообщение
Так последний вопрос был совсем не об этом.
Цитата Сообщение от sys_beginner Посмотреть сообщение
как сделать так, что бы реализация map не дублировалась на каждую единицу трансляции в которой она используется (или этого не происходит?)
Этот вопрос? У меня встречный: как ты собираешься использовать map в единицах трансляции, в которых нет подключения <map>?
0
Undisputed
217 / 145 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
26.02.2017, 22:53  [ТС] 18
Цитата Сообщение от nd2 Посмотреть сообщение
В С++ есть ещё какие-то шаблоны?
Ну я подумал речь о нереализованных методах как привел пример выше (в си вроде такие функции называются шаблонами функций, подумал может речь об этом).
Цитата Сообщение от nd2 Посмотреть сообщение
Это вопрос? У меня встречный: как ты собираешься использовать map в единицах трансляции, в которых нет подключения <map>?
У меня под рукой сейчас нет компилятора что бы проверить, но я помню что компилировал с командной строки следующим образом: перечислял файлы которые должны быть скомпилированы(они в свою очередь подключали хедера), а реализацию этих хедеров указывал всего 1 раз.

Вот я и думаю что если в каждую единицу трансляции воткнуть реализацию - то будет дублирование и хочется этого как нибудь избежать... Ну вот теперь ты видишь общий ход моих мыслей. Можешь поправить относительно тех моментов где я по твоему заблуждаюсь?
0
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
26.02.2017, 23:03 19
Цитата Сообщение от sys_beginner Посмотреть сообщение
а реализацию этих хедеров указывал всего 1 раз.
Реализация в файле с каким расширением была?

Добавлено через 2 минуты
Цитата Сообщение от sys_beginner Посмотреть сообщение
Вот я и думаю что если в каждую единицу трансляции воткнуть реализацию - то будет дублирование
Будет ошибка множественных определений.
Но (про <map>):
Цитата Сообщение от nd2 Посмотреть сообщение
Там шаблоны, поэтому присутствие их в нескольких единицах трансляции не вызовет ошибки множественных определений
0
Undisputed
217 / 145 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
26.02.2017, 23:09  [ТС] 20
Цитата Сообщение от nd2 Посмотреть сообщение
Реализация в файле с каким расширением была?
.c

///

Добавлено через 1 минуту
Цитата Сообщение от nd2 Посмотреть сообщение
Там шаблоны, поэтому присутствие их в нескольких единицах трансляции не вызовет ошибки множественных определений
А в чем отличие? Шаблон ведь в итоге становится конкретной реализацией которая определяется типами которые в него подставляются

Добавлено через 16 секунд
Цитата Сообщение от nd2 Посмотреть сообщение
Там шаблоны, поэтому присутствие их в нескольких единицах трансляции не вызовет ошибки множественных определений
А в чем отличие? Шаблон ведь в итоге становится конкретной реализацией которая определяется типами которые в него подставляются
0
26.02.2017, 23:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2017, 23:09

Линковка, реализация в заголовочных файлах
Ситуация следующая. Представим себет хедер, который содержит некоторый...

Определение переменных в заголовочных файлах
Здорова! Определил переменную в заголовочном фале от так #pragma once...

Начала STL и контейнеры C++
Многие улучшения, сделанные из C в C++ вызывают сомнения и вопросы... Именно...


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

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

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