Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Undisputed
165 / 96 / 20
Регистрация: 10.06.2014
Сообщений: 1,386
Завершенные тесты: 3
#1

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

26.02.2017, 19:46. Просмотров 650. Ответов 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 в заголовочных файлах (C++):

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

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

Массивы в заголовочных файлах - C++
в заголовочном файле в описании класса пишу: int _const_iMas = {0x63,0x7c,0x78,0x79}; В итоге компилятор подчёркивает знак '='...

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

Контейнеры STL - C++
Кто знает где найти информацию по поводу стандартных контейнеров STL? Интересует не то, как их применять, а основы реализации. Может быть...

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

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

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

Мне интересно, если включать map во всех хедерах и это не приводит к ошибке компиляции, то как это работает?
Там сидят объявления? А потом достаточно 1 раз подцепить файл реализации map? Вот это мне не понятно...
0
nmcf
5754 / 5065 / 1732
Регистрация: 14.04.2014
Сообщений: 20,749
26.02.2017, 20:48 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Где-то были рассуждения, что эти опережающие ускоряют компиляцию.
Ну там же везде проверки вставляют на многократное подключение.
1
nd2
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
26.02.2017, 21:05 #9
Цитата Сообщение от sys_beginner Посмотреть сообщение
Там сидят объявления?
Там сидят шаблоны.
0
Undisputed
165 / 96 / 20
Регистрация: 10.06.2014
Сообщений: 1,386
Завершенные тесты: 3
26.02.2017, 21:17  [ТС] #10
Цитата Сообщение от nmcf Посмотреть сообщение
Ну там же везде проверки вставляют на многократное подключение.
Ясно, спасибо. Но что плохо - в каждой единице трансляции будет дублирование этот map-а. Соответственно кода будет больше.

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

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

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

Добавлено через 46 секунд
Просто подключай map везде, где нужно и всё.
1
nd2
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
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
26.02.2017, 22:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2017, 22:03
Привет! Вот еще темы с ответами:

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

Начала STL и контейнеры C++ - C++
Вот такой вот простенький текст предлагается &quot;Начала STL и контейнеры C++&quot;. Скачать свободно можете здесь - и короткие главки (их 21 на...

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

Ассоциативные контейнеры STL - C++
Везде сказано: set - упорядоченное множество уникальных элементов. (есть куча примеров и уроков) multiset - то же что и set, но...


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

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

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