У меня есть интерфейс COM с методом, который возвращает объект:
interface ICreatorInterface {
HRESULT CreateObject( IObjectToCreate** );
};
Ключ в том, что вызов ICreatorInterface::CreateObject()
- единственный способ получить объект, реализующий интерфейс IObjectToCreate
.
В C ++ я мог бы сделать это так:
HRESULT CCreatorInterfaceImpl::CreateObject( IObjectToCreate** result )
{
//CObjectToCreateImpl constructor sets reference count to 0
CObjectToCreateImpl* newObject = new CObjectToCreateImpl();
HRESULT hr = newObject->QueryInterface( __uuidof(IObjectToCreate), (void**)result );
if( FAILED(hr) ) {
delete newObject;
}
return hr;
}
или так
HRESULT CCreatorInterfaceImpl::CreateObject( IObjectToCreate** result )
{
//CObjectToCreateImpl constructor sets reference count to 1
CObjectToCreateImpl* newObject = new CObjectToCreateImpl();
HRESULT hr = newObject->QueryInterface( __uuidof(IObjectToCreate), (void**)result );
// if QI() failed reference count is still 1 so this will delete the object
newObject->Release();
return hr;
}
Разница заключается в том, как инициализируется счетчик ссылок и как осуществляется удаление объекта в случае сбоя QueryInterface()
. Поскольку я полностью контролирую и CCreatorInterfaceImpl
, и CObjectToCreateImpl
, я могу пойти любым путем.
IMO, первый вариант более понятен - все вещи для подсчета ссылок находятся в одном куске кода. Я что-то наблюдал? Почему второй подход может быть лучше? Что из вышеперечисленного лучше и почему?