Я создаю небольшую библиотеку графического пользовательского интерфейса, которая будет создавать кнопки, контрольные списки, полосы прокрутки и т. д., и у меня есть некоторые проблемы с выбором лучшего подхода.
У меня есть базовый класс Widget code>, который может иметь дочерние объекты, унаследованные от виджета, а также может быть дочерним. У меня есть два противоположных подхода:
Используйте необработанные указатели. Дочерний список будет выглядеть примерно так: std::vector Children и при уничтожении он удалит их всех (с помощью специального деструктора). Также при таком подходе пользователь может вручную удалить объект Widget, и он будет правильно очищен. Но необработанные указатели на объекты Widget иногда копируются во внутренние буферы библиотеки для рисования и других вещей. Если объект будет удален, находясь в каком-то буфере, это будет катастрофа.
Используйте общие указатели. Объекты будут уничтожаться всякий раз, когда они действительно не используются, но если они имеют несколько родителей или находятся в каком-то буфере, они не будут удалены. Также пользователь не может вручную использовать удаление для принудительного удаления объекта, а только общий указатель на него. И я упомяну, что если пользователь попытается создать объект в стеке/куче вручную (без общего указателя), его время жизни будет управляться неправильно и приведет к очевидным последствиям.
Какой из них лучше? Или, может быть, как улучшить один или оба, чтобы они были надежными?
Я создаю небольшую библиотеку графического пользовательского интерфейса, которая будет создавать кнопки, контрольные списки, полосы прокрутки и т. д., и у меня есть некоторые проблемы с выбором лучшего подхода. У меня есть базовый класс Widget code>, который может иметь дочерние объекты, унаследованные от виджета, а также может быть дочерним. У меня есть два противоположных подхода: [list] [*]Используйте необработанные указатели. Дочерний список будет выглядеть примерно так: std::vector Children и при уничтожении он удалит их всех (с помощью специального деструктора). Также при таком подходе пользователь может вручную удалить объект Widget, и он будет правильно очищен. Но необработанные указатели на объекты Widget иногда копируются во внутренние буферы библиотеки для рисования и других вещей. Если объект будет удален, находясь в каком-то буфере, это будет катастрофа. [*]Используйте общие указатели. Объекты будут уничтожаться всякий раз, когда они действительно не используются, но если они имеют несколько родителей или находятся в каком-то буфере, они не будут удалены. Также пользователь не может вручную использовать удаление для принудительного удаления объекта, а только общий указатель на него. И я упомяну, что если пользователь попытается создать объект в стеке/куче вручную (без общего указателя), его время жизни будет управляться неправильно и приведет к очевидным последствиям. Какой из них лучше? Или, может быть, как улучшить один или оба, чтобы они были надежными? [/list]