|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
Добавление своего типа данных в map04.12.2019, 15:36. Показов 2005. Ответов 18
Метки нет (Все метки)
Приветствую всех. Сделал тестовый пример:
m выходит за область видимости. Но откуда еще 2 деструктора и где относящиеся к ним конструкторы?
0
|
||||||
| 04.12.2019, 15:36 | |
|
Ответы с готовыми решениями:
18
Нужен совет по созданию своего типа данных Передача в контейнер map пользовательского типа данных sort для своего типа данных |
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||
| 04.12.2019, 16:33 | |||||||
std::pair, потом в map, на каждое перемещение отрабатывает деструкторДобавлено через 1 минуту Используй emplace, вместо insert
1
|
|||||||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 04.12.2019, 16:38 [ТС] | |
|
oleg-m1973, спасибо. Но есть проблема. У меня система, где у map нет метода emplace. Как быть в этом случае?
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 04.12.2019, 16:43 | ||
|
1
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||
| 04.12.2019, 16:50 [ТС] | ||
|
Не могу сообразить как выйти из этой ситуации...
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||
| 04.12.2019, 17:00 | |||||||
Если unique_ptr тоже не поддерживается, сделай std::map<string, A*>, только не забывай удалять эти указатели Добавлено через 1 минуту Кстати, что у тебя за компилятор, может просто обновить его?
0
|
|||||||
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,105
|
||||||
| 04.12.2019, 18:14 | ||||||
|
в старых компиляторах можно попробовать поискать тут (в VS9 уже есть)
0
|
||||||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||
| 05.12.2019, 08:41 [ТС] | ||||
.В общем, решил просто нормально запрограммировать свой класс, определив в нем не только конструктор по умолчанию, но и конструктор копирования и оператор присваивания копированием (правило трех). Так как объект класса управляет файлом, то при создании копии объекта эта копия должна управлять тем же файлом. Кроме этого, при удалении одного из объекта (оригинала или копии) необходимо учитывать, нет ли "в живых" другого объекта, который управляет тем же файлом. Тогда можно будет спокойно использовать метод insert через make_pair.
0
|
||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 05.12.2019, 10:52 | ||
|
А ещё лучше, напиши свой класс, аналог shared_ptr, он довольно простой и решит все твои проблемы
0
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
| 05.12.2019, 11:40 [ТС] | ||||||
|
Croessmah, добавление
const избавило от одной пары конструктор копирования - деструктор. Спасибо.Теперь столкнулся с другой проблемой. Если обратиться в контейнере к существующему в нем элементу по ключу, то происходит вызов конструктора по умолчанию (без этого конструктора код обращения к элементу вообще не компилится), затем конструктора копирования, затем два раза деструктор. Все усложняет еще то, что этот же код в онлайн компиляторе работает без вызова конструкторов и деструкторов при обращении к элементу. Можете объяснить, что в моей STL библиотеке не так? Тестируемый код: Кликните здесь для просмотра всего текста
Результат моего компилятора: Кликните здесь для просмотра всего текста
Начало программы --------------------------------------------------
Files.insert(make_pair<const string, IFile>(File, IFile())); ------ IFile() IFile(const IFile& iFile) IFile(const IFile& iFile) ~IFile() ~IFile() Files[File]; ------------------------------------------------------ IFile() IFile(const IFile& iFile) ~IFile() ~IFile() Files.clear(); ---------------------------------------------------- ~IFile() Конец программы --------------------------------------------------- Результат онлайн компилятора (тип компилятора выбран С++): Кликните здесь для просмотра всего текста
Начало программы --------------------------------------------------
Files.insert(make_pair<const string, IFile>(File, IFile())); ------ IFile() IFile(const IFile& iFile) IFile(const IFile& iFile) ~IFile() ~IFile() Files[File]; ------------------------------------------------------ Files.clear(); ---------------------------------------------------- ~IFile() Конец программы ---------------------------------------------------
0
|
||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 05.12.2019, 11:43 | ||
|
0
|
||
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,105
|
||||||
| 05.12.2019, 11:46 | ||||||
|
d7d1cd, у make_pair можно не указывать параметры шаблона, он их выведет
Наверное, в онлайн компиляторе тоже оптимизатор поработал
0
|
||||||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|||
| 05.12.2019, 12:25 [ТС] | |||
|
1. Вы внимательно прочитали сообщение?
0
|
|||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 05.12.2019, 12:30 | ||
|
0
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||
| 05.12.2019, 12:33 [ТС] | ||
|
Частично разобрался почему при обращении к существующему элементу вызываются конструкторы. Все из-за того, что в моей реализации STL оператор [] вызывает метод insert (что даже указано в справке) без предварительной проверки на существование элемента. Естественно, метод insert требует сконструированный объект.
0
|
||
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
| 05.12.2019, 15:14 | |
|
0
|
|
|
Неэпический
|
|
| 05.12.2019, 15:18 | |
|
0
|
|
| 05.12.2019, 15:18 | |
|
Помогаю со студенческими работами здесь
19
Использование vector insert и своего типа данных
Можно ли реализовать Map от своего класса?
добавление в map Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|