Точка общих указателей (и других подобных оболочек для указателей) состоит в том, чтобы правильно обрабатывать уничтожение указателя на объект.То есть вместо того, чтобы вручную проверять удаление последней копии (и только последней копии), общий указатель позаботится о вас, когда он выйдет из области видимости.Совместно используемая часть означает, что вы можете создавать копии этого объекта-оболочки (объект общего указателя), и он будет «делиться» указателем на объект между копиями (как если бы вы сделали копию обычного указателя) с дополнительным преимуществомкак описано выше.
Что касается вашего кода, SomeClass::doStuff()
должен иметь параметр QScopedPointer<QFile>
(вместо QIODevice*
), когда вы передаете ему item
, который имеет этот тип.
То же самое с конструктором MyObject
: он принимает параметр типа QPointer<QIODevice>
или QSharedPointer<QIODevice>
.В общем, везде, где вы будете использовать указатели, используйте QSharedPointer
(с соответствующим типом шаблона).Это избавит вас от головной боли, связанной с последующим доступом к удаленным объектам.
Конечно, иногда вам действительно нужен необработанный указатель QIODevice
(например, для вызова сторонней библиотеки), тогда вы будете использовать data()
функция-член объекта общего указателя.Просто убедитесь, что вы не сохраняете (то есть сохраняете или иным образом копируете то, что необходимо) возвращенный необработанный указатель, потому что это подорвет назначение общих указателей - общие указатели не будут знать о вашем дополнительном необработанном указателе, который не находится подуправление объектами общего указателя.
EDIT: take()
освобождает владельца указанного объекта от указателя в области, поэтому при уничтожении указателя в области он не удаляет объект.Вы не могли бы использовать его в ситуации, когда вы передали право собственности на что-то другое - как в вашем случае на MyObject
.