Во-первых, мой актуальный вопрос
У меня есть общий указатель на карте, я хочу удалить этот общий указатель с карты, когда в самой карте нет других ссылок, кроме общего указателя, поэтому цель освобождается. Как я могу это сделать? В качестве альтернативы, какой дизайн лучше решить мою проблему?
Фон ниже:
Из-за ностальгии я писал движок MUD на C ++, используя бэкэнд MySQL. Сейчас я нахожусь в точке сохранения сущностей (таких как учетные записи, персонажи и т. Д. В этом контексте). У меня возникли проблемы с поиском наилучшего способа реализации этого, и я решил обратиться за советом.
Моя нынешняя архитектура персистентности выглядит следующим образом, принимая пример за пример
Символьная сущность -> Символьная память -> Персональная персистентность -> MySQL
Символьная сущность относится к самому персонажу и является аналогом модели в MVC. Он не имеет ничего, кроме данных, и знает только о других объектах.
Хранение символов — это контейнер, в настоящее время ответственный за хранение экземпляров символьного объекта в памяти. Когда делается запрос на поиск символа по идентификатору или имени, он проверяет его память, реализованную как отображение std :: string, содержащего UUID, в std :: shared_ptr. Если у нас уже есть экземпляр в памяти, мы передаем обратно общий указатель, если нет, мы запрашиваем его для слоя постоянства, сохраняем его на карте и затем передаем ему общий указатель.
Уровень персистентности является абстрактным, есть интерфейс character_persistence, в котором есть конкретная реализация mysql_character_persistence, поэтому я мог легко переключаться на другие формы персистентности.
Я использовал подсчет ссылок и шаблонный тип entity_ptr.
Я создал интерфейс entity_ptr_provider, который определил методы receive (uuid) и release (uuid). Entity_ptr принимает шаблонный аргумент типа объекта (аккаунт, персонаж и т. Д.), Объект этого типа и entity_ptr_provider.
При создании или копировании типа entity_ptr он вызывает get для entity_ptr_provider с UUID объекта, поэтому он может увеличивать ссылки на него, когда он деконструируется, он вызывает release, что позволяет entity_ptr_provider уменьшать ссылку. Когда ссылки достигают 0, он освобождается от таблицы.
Других решений пока нет …