Я прохожу некоторый унаследованный код C ++, связанный с библиотекой компонентов Windows Imaging, и заметил следующее:
void setProperties(IPropertyBag2* const pBag)
{
pBag->Write(...);
}
void other_function()
{
CComPtr<IPropertyBag2> pBag;
//Code to initialize pBag
setProperties(pBag);
}
setProperties
Метод просто записывает набор свойств в пакет свойств.
Код компилируется и работает нормально, потому что я думаю, что он вызывает соответствующий оператор приведения типов.
У меня вопрос, рекомендуется ли такой интерфейс или есть лучший способ передачи указателя.
Например, есть ли разница (с точки зрения безопасности / производительности), если подпись была изменена на:
void setProperties(const CComPtr<IPropertyBag2>& pBag)
Необработанные указатели интерфейса — это канонический способ работы с COM-объектами. Они также самые гибкие. Использование ссылки на CComPtr свяжет вас с использованием CComPtr всегда.
Любой указатель COM, даже тупой, автоматически становится умным указателем, поскольку сам объект реализует AddRef
а также Release
, Если функция не хранит копию указателя, нет необходимости беспокоиться об этом.
Для удобства тип CComPtr автоматически приведёт себя к необработанному указателю.
Использование параметра CComPtr не так много преимуществ (если только он не является константным, и вы не собираетесь его изменять). CComPtr более полезен для локальных переменных и переменных экземпляра.
Но это нормально, если это только вопрос стиля / последовательности.