|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
||||||
Паттерны проектирования30.07.2020, 18:06. Показов 3084. Ответов 21
Добрый день! Начал читать книгу GoF, сами паттерны мне пока что понятны, но есть один вопросик, связанный с очисткой всего того, что мы создаем. Возьмем пример с лабиринтом из части о порождающих паттернах (код ниже).
0
|
||||||
| 30.07.2020, 18:06 | |
|
Ответы с готовыми решениями:
21
Паттерны проектирования (Фабрики) Паттерны проектирования. Где найти диаграммы?
|
|
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,686
|
|
| 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
|
|||||
|
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,686
|
|
| 30.07.2020, 20:03 | |
|
hoggy, убедил, правило которого стоит придерживаться, тогда что? Держать в комнате счетчик ссылок и уничтожать по обнулении?
0
|
|
|
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
|
| 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
|
||
|
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
|
| 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
|
||||||
|
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
|
| 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 диаграмма Объектно-ориентированного проектирования и проектирования на основе структур данных Паттерны Паттерны Порождающие паттерны Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|