И вот пример того, как вы бы это использовали:

овольно сложно объяснить, но я буду стараться изо всех сил. Итак, у меня есть RenderComponent, EventManager и RenderSystem. В моем конструкторе RenderComponents я вызываю событие renderComponentCreated, на которое подписывается RenderSystem. Используя объект args события, я передаю RenderNode в качестве данных, которые содержат информацию, необходимую для визуализации объекта renderSystem (drawable, position и type).

Все идет нормально. Теперь, когда renderComponent удален, я хочу, чтобы RenderNode удалялся из RenderSystem автоматически, при этом оставляя возможность удалить его вручную, например. как реакция на какое-то событие. Это можно сделать с помощью RenderComponentRemoveNodeEvent, на который снова подписывается RenderSystem.

Теперь «проблема». Из моего понимания (и из того, что я хочу), renderNode должен быть чем-то уникально принадлежащим RenderComponent (следовательно, unique_ptr). Однако для этого потребуется либо скопировать (и реализовать оператор сравнения для renderNode ->, чтобы иметь возможность найти его, когда я захочу удалить его), либо передать указатель reference / raw на renderNode. Однако (если я прав) нет способа узнать, ссылается ли ссылка на действительный объект, что означало бы, что автоматическое удаление не может быть реализовано.

Мое решение состояло в том, чтобы сделать RenderNode (который уникально принадлежит RenderComponent) общим и передавать слабые указатели на событие. RenderSystem также теперь поддерживает список слабых указателей, которые он проверяет, указывают ли они на действительный объект, и автоматически удаляет их, если нет. По сути, я бы хотел создать слабый указатель из уникального. Однако, как сейчас, кто-то может просто создать общий указатель из слабого указателя и поддерживать RenderNode дольше, чем следовало бы. Поскольку сам управляемый объект (RenderNode) содержит ссылки на другие объекты, которые не будут существовать дольше, чем RenderComponent, это может вызвать серьезные проблемы.

Мой вопрос сейчас: это можно считать хорошим дизайном или я что-то пропустил?

PS: Извините, если это объяснение звучит немного неуклюже (английский не мой родной) и спасибо за вашу помощь!

Ответы на вопрос(1)

Ваш ответ на вопрос