2014-03-05 44 views
1

有一個如下功能:傳遞指針的值

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

我怎麼稱呼它,這樣pMediaType作爲參考,一切都做的方法傳遞的對象被保留?

+0

您確實如何通過引用傳遞任何其他類型... –

+0

與&運算符? – Luke

+5

除非您需要更改'pMediaType'指向的內容,否則這不是問題。對象內容的任何更改都直接適用於您傳遞的地址的對象。 – crashmstr

回答

5

因爲您將該對象作爲指針賦予該函數,所以對該方法中的對象執行的所有操作都將保留。

您可以通過以下方式調用它:

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

但如果我聲明它像一個指針:CMediaType * pMediaType,正確的語法將GetMediaType(0,pMediaType);對? – Luke

0

正如你現在知道了:

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

在這樣的代碼:

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

什麼你在上做10裏面GetMediaType()機體是「保存」在呼叫現場,因爲你通過指針mediaType

但是,如果你想創建的CMediaType一個新的實例內GetMediaType()身體,並返回它作爲調用者必須以某種方式免費使用(有點像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規則,保持代碼儘可能簡單(這樣可以避免雙重間接指針,如果可以的話)。