RAII назван неправильно, как (я думаю) Скотт Мейерс отмечает.
Это не должно называться «Приобретение ресурсов - это инициализация», оно должно называться «Разрушение - это освобождение ресурсов».Но мы находимся там, где мы есть.
Если ячейка "владеет" объектом, на который указывает representation_
, и удаляет его в своем деструкторе, то это все еще форма RAII, так же, как вы можетеинициализируйте shared_ptr
с нулевым указателем, а затем установите его в другое значение.Я предполагаю, что вы используете его правильно (убедитесь, что объект был сохранен в какой-либо ячейке или другой сразу же после его создания, без шансов сбоя между завершением конструктора и сохранением указателя где-нибудь, где он будет в конечном итоге освобожден).Если это так, вы используете важную часть RAII, даже если это не конструктор, выполняющий работу.
Это, вероятно, нарушение принципа единственной ответственности.Вы сделали Cell ответственным за представление ячейки, а также за управление памятью этого QAbstractGraphicsItem
объекта.Вероятно, это упростит процесс изменения representation_
на умный тип указателя, поэтому нет необходимости в каком-либо специальном коде в деструкторе Cell.
Если Cell не «владеет» объектом, на который указываетrepresentation_
, тогда это также не нарушает RAII, оно просто не реализует его.Что-то еще придется нести ответственность за владение объектом.Может быть, эта другая вещь использует RAII, может быть, это нарушает его.Чтобы гарантировать, что объект живет до тех пор, пока ячейка нуждается в нем, он должен был бы каким-то образом участвовать в жизненном цикле ячейки (например, если он владеет ячейкой, с вами может быть все в порядке).Так что, если это не так, есть большая вероятность, что он как-то нарушает RAII.