Можно ли хранить объекты Bear в QList<Bear>
по значению?
Нет. Ваша цитата из документации была правильной: внутренне, QList<T>
магазиныуказатели на элементы типа T
.
Вместо этого используйте QVector
, который хранит объекты по значению типа больше, чем указатель (что и является его целью).
Аналогичная проблема с элементами в QList<>
- это проблемы с защитой QVariant
, которая содержит любой примитивный тип или некоторые другие небольшие типы (например, QDate
).Таким образом, вы получаете семантику значений в QVariant
, только если ваше значение помещается в примитив или указатель.
Полное сдерживание будет достигнуто, если у вас будет контейнер объектов, таких как QPointer
или QSharedPointer
экземпляров,которые логически разделяют и отслеживают ссылки на (подсчитанные ссылки) объекты и т. д.
В отличие от STL (с семантикой значений), Qt опирается на контейнеры «указателей на элементы» из-за проблем, когда эти элементыполиморфный (разные размеры в производных классах).(Это довольно часто встречается в объектно-ориентированных системах, поэтому Qt по умолчанию использует семантику указателей.)
Например, в Qt отлично подходит QList<Bear>
(реализовано как контейнер указателей на Bear
экземпляры), но std::list<Bear>
будет проблематичным, если все экземпляры Bear имеют разный размер (например, если KodiakBear
и BlackBear
получены из Bear
, и вы добавили эти производные экземпляры в класс std::list<Bear>
).В этом случае производное состояние будет «очищено» через семантику значения.