|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
||||||
Паттерны проектирования30.07.2020, 18:06. Показов 3107. Ответов 21
Добрый день! Начал читать книгу GoF, сами паттерны мне пока что понятны, но есть один вопросик, связанный с очисткой всего того, что мы создаем. Возьмем пример с лабиринтом из части о порождающих паттернах (код ниже).
0
|
||||||
| 30.07.2020, 18:06 | |
|
Ответы с готовыми решениями:
21
Паттерны проектирования (Фабрики) Паттерны проектирования. Где найти диаграммы?
|
|
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
|
|
| 30.07.2020, 18:54 | |
|
А что Вас смущает? После добавления комнаты в лабиринт, он (лабиринт) стал владельцем объекта, ему и удалять.
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 30.07.2020, 19:34 | |||||
|
дело в том, что все эти new/delete работают с т.н. "менеджером памяти". какой именно используется менеджер - это зависит от crt (с++ библиотека времени выполнения) если твоя библиотека и приложение используют различный crt (такое может быть когда приложение линкуется с dll, например) тогда нет никаких гарантий что используемые менеджеры памяти будут совместимы. и если память выделит один менеджер (например, менеджер приложения), а удалять будет другой (менеджер библиотеки), тогда последствия не определены. скорее всего будет краш из-за попытки удалить чужую память. тебя совсем не смущает, что ты вешаешь на класс ответственность, которая не имеет никакого отношения к его работе? вот как ты будешь в классе лабиринта контролировать как правильно удалять память, которая выделяется хрен-знает-как вообще в отдельном модуле? если память выделялась в соседней библиотеке, то безопасно удалить её можно только и только на стороне этой же библиотеки.
1
|
|||||
|
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
|
|
| 30.07.2020, 20:03 | |
|
hoggy, убедил, правило которого стоит придерживаться, тогда что? Держать в комнате счетчик ссылок и уничтожать по обнулении?
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 30.07.2020, 20:51 | |
|
Annemesski,
1) можно не отдавать владение на сторону 2) можно предоставлять правильные функции удаления, которыми другая сторона может воспользоваться
1
|
|
|
Комп_Оратор)
|
|||
| 30.07.2020, 21:03 | |||
|
Добавлено через 9 минут shared_ptr<Room>, например, подошёл бы (или придётся руками делетить). :-)
1
|
|||
|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
|||
| 30.07.2020, 22:36 [ТС] | |||
|
https://habr.com/ru/post/427281/
Добавлено через 1 минуту Добавлено через 1 минуту
0
|
|||
|
Комп_Оратор)
|
||
| 30.07.2020, 22:41 | ||
vector<shared_ptr<MapSite>> mapSitesPtrs всё работает в поле RAII как для простых объектов на стеке (в смысле автоматики только, разумеется). В этом плане, вопрос о том кто будет убирать - риторика. ![]() Базовые указатели указывают на объекты конкретных типов-наследников и вам незачем знать кто и как их удаляет.
1
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 30.07.2020, 23:03 | |
|
Nishen, если владение передавалось через границу модуля, то умные указатели без правильного deleter`а также могут испортить все дело, как и ручной delete, при наличии двух менеджеров памяти.
Вот тут у меня есть пример, как этого избегать.
0
|
|
|
Комп_Оратор)
|
||||||
| 31.07.2020, 01:02 | ||||||
|
Nishen, интерфейсы это широкая тема. В самом общем смысле весь мир интерфейс и люди в нём интерфейсы.
![]() А конкретный лабиринт, это граф, но в игровом контексте. И контекст задаёт ... контекст. То есть, если лабиринт виден весь и сразу, то жизненный цикд - весь игровой сеанс. Если виден фрагмент (сверху) то имеет смыл разделять время жизни видимых и не видимых объектов. А если видны лишь объекты доступные из одной комнаты, но высоко детализировано и прорисовано (ресурсоёмко) то кольцо сужается еще сильнее. В этом контексте можно придумать разные вещи. Мне приходит на ум паттерн состояние. То есть, есть мапа -примитивно сгенерированный лабиринт (частично или полностью, тоже зависит от контекста). В нем есть узел в котором находится игрок. Узел в фокусе. Этот узел создает окружающие узлы согласно карте. То есть, он выделяет все ресурсы для детального представления. А как только игрок активизирует (фокусирует) другой узел, бывший фокус освобождает непересекающиеся ресурсы. Новый это объект окружения старого фокуса и был создан заблаговременно, но он должен создать недостающие объекты своего окружения (чтобы они были готовы принять следующий фокус). Это может напоминать пчелу перелетающую с ромашки на ромашку. Только срединки ромашек - лепестки соседей. Всё это абсолютно непонятно, но сделать можно. ![]() Я хотел сказать, что вопрос жизненного цикла плотно связан игровым контекстом. Это может подсказать оптимальную или приемлемую модель владения. В простом автомате где стэйты -узлы не требующие ресурсов и времени, каждое состояние создайт новое, - передаёт фокус и удаляет себя при помощи очень страшного delete this . Тут и смартов не требуется. Но в "с ромашки на ромашку" тоже так можно.http://cpp-reference.ru/patter... rns/state/
1
|
||||||
|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
||||||
| 04.08.2020, 11:56 [ТС] | ||||||
0
|
||||||
|
Комп_Оратор)
|
|||||||
| 04.08.2020, 12:08 | |||||||
|
https://en.cppreference.com/w/... shared_ptr
new Derived1(/*args*/) прямо в emplace_back можно скормить.
1
|
|||||||
|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
|
| 04.08.2020, 12:46 [ТС] | |
|
Спасибо, я понял!
0
|
|
|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
||||||
| 05.08.2020, 13:20 [ТС] | ||||||
|
Вот конечный вариант, написанный на умных указателях:
0
|
||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 05.08.2020, 13:25 | |
|
0
|
|
|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
|
| 05.08.2020, 13:28 [ТС] | |
|
Это я эксперементировал и забыл убрать.
0
|
|
|
Комп_Оратор)
|
||||||||||||||||
| 05.08.2020, 13:40 | ||||||||||||||||
|
может так
а потом
0
|
||||||||||||||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|
| 05.08.2020, 13:51 | |
|
del
0
|
|
|
Комп_Оратор)
|
||
| 05.08.2020, 15:28 | ||
![]() А в принципе и на смартах это сделать можно. Создавать только фабрикой, (набирать контейнер лепестков). При активации лепестка - сам становится лепестком и мувает лепестки (пересекающийся набор) активизированному - будущему цветку. При уничтожении (когда лепесток не нужен) у него уже пустой контейнер и он не может грохнуть ни чего. Можно для скорости даже 2-хуровневые ромашки реализовать (лепестки с лепестками). Это расточительнее но не потребует вычислений в жестких временных рамках. Там уже будут общие и это чуть сложнее. Но всё, это уже легче самому написать, чем рассказать. Есть элемент получения части решения в процессе.
0
|
||
|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
|
| 05.08.2020, 18:57 [ТС] | |
|
0
|
|
| 05.08.2020, 18:57 | |
|
Помогаю со студенческими работами здесь
20
Паттерны проектирования, нужен код на С++ и UML диаграмма Объектно-ориентированного проектирования и проектирования на основе структур данных Паттерны Паттерны Порождающие паттерны Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|