У меня есть класс, который имеет элемент
std::list<boost::reference_wrapper<polygonType> > m_children;
Когда объект создается из этого класса, я сохраняю все дочерние элементы этого объекта как ссылку в этой переменной.
Я хотел, чтобы, когда вызывался деструктор объекта, я хотел, чтобы деструктор детей вызывался.
Это в основном сводится к некоторым проектным решениям, которые я принял, и к тому, как я хочу их исправить.
Это автоматическое поведение в этом случае?
Хранение reference_wrapper
эквивалентно хранению необработанного указателя. На самом деле, нет веских причин для хранения reference_wrapper
скорее, чем polygonType*
Вот.
Если я хочу, чтобы они не были удалены, что мне нужно сделать?
Хранить указатели (или reference_wrapper
, если вы настаиваете на запутывании). Вероятно, было бы более эффективно использовать vector
скорее, чем list
:
std::vector<polygonType*> children;
Вы должны быть осторожны, чтобы то, что несет ответственность за уничтожение детей, не оставляло здесь висячие указатели. Вы можете рассмотреть возможность управления ими с помощью общих указателей и сохранения слабых указателей в списке, чтобы этого не произошло.
Если я хочу, чтобы они были удалены, что мне нужно сделать?
Если polygonType
это конкретный тип, то вы можете хранить дочерние элементы прямо в списке. В этом случае, list
может быть лучшим выбором, так как он никогда не будет копировать или перемещать содержащиеся в нем объекты:
std::list<polygonType> children;
Если это полиморфный базовый класс, и вы не можете хранить объекты напрямую, тогда сохраняйте умные указатели. Снова, vector
вероятно, лучший выбор, чем list
если вы храните указатели, а не объекты:
std::vector<std::unique_ptr<polygonType>> children;
Если вы застряли с библиотекой до 2011 года, вы можете использовать boost::shared_ptr
скорее, чем std::unique_ptr
; или возможно Контейнер повышения указателя.
Других решений пока нет …