Передать указатель по значению

Имея следующую функцию:

virtual HRESULT GetMediaType(
int iPosition,
CMediaType *pMediaType
);

Как я называю это так, что pMediaType передается по ссылке, и все, что сделано с объектом в методе, сохраняется?

1

Решение

Поскольку вы передаете объект функции в качестве указателя, все, что сделано с объектом в методе, сохраняется.

Вы можете назвать это следующим образом:

CMediaType pMediaType;
GetMediaType( 0, &pMediaType );
5

Другие решения

Как у вас сейчас есть:

virtual HRESULT GetMediaType(
int iPosition,
CMediaType *pMediaType
);

в коде так:

CMediaType mediaType;
...GetMediaType(position, &mediaType);

все, что вы делаете на pMediaType внутри GetMediaType() тело «Сохранились» на сайте вызова, так как вы передаете указатель в mediaType,

Однако, если вы хотите создать новый экземпляр CMediaType внутри GetMediaType() body и вернуть его в качестве значения выходного указателя, который вызывающий должен как-то освободить после использования (вроде как COM IUnknown::QueryInterface()), то вы можете использовать указатели с двойной косвенностью, например

virtual HRESULT GetMediaType(
int iPosition,
CMediaType** ppMediaType    // [OUT] Created by the method, must be freed by the caller
);

Образец использования:

CMediaType* pMediaType = nullptr;
...GetMediaType(iPosition, &pMediaType);

... use pMediaType ...
...
... somehow release pMediaType

В любом случае, попробуйте применить правило KISS, сделав код максимально простым (поэтому избегайте указателей с двойным косвенным указанием, если можете).

0

По вопросам рекламы [email protected]