通过引用传递指针正确的方法来做到这一点?

时间:2013-04-01 11:36:54

标签: c++ oop function pointers reference

这是我的功能:

void CreateRenderTarget(HWND, ID2D1HwndRenderTarget*);

它的工作原理如下:

void D2DRes::CreateRenderTarget(HWND hwnd, ID2D1HwndRenderTarget* pRT)
{
    RECT rc;
    GetClientRect(hwnd,&rc);

    pFactory->CreateHwndRenderTarget(
            D2D1::RenderTargetProperties(),
            D2D1::HwndRenderTargetProperties(
                hwnd,
                D2D1::SizeU(
                    rc.right - rc.left,
                    rc.bottom - rc.top)),
                &pRT);
}

它被称为:

pD2DRes->CreateRenderTarget(map.GetHWnd(),map.GetpRT());

从CreateRenderTarget()返回后,map.pRT为NULL。怎么来的?

编辑:有我的GetpRT()函数:

ID2D1HwndRenderTarget* MapEditor::GetpRT()
{
    return pRT;
}

2 个答案:

答案 0 :(得分:2)

第一个问题:

  

CreateRenderTarget()返回后,map.pRTNULL。怎么来的?

因为您没有通过引用传递指针 。为了通过引用传递它,CreateRenderTarget()的签名应该是:

void CreateRenderTarget(HWND, ID2D1HwndRenderTarget*&);
//                                                  ^

除非你这样做,否则你的CreateRenderTarget()将处理作为参数传递的指针的副本,并且更改其值不会影响原始指针。

第二个问题:

你写道:

  

[...]我的GetpRT()功能:

ID2D1HwndRenderTarget* MapEditor::GetpRT()
{
    return pRT;
}

注意,GetpRT还应该将引用返回到内部pRT指针,否则上述更改将不起作用(您将通过引用传递原始pRT副本

因此,您应该相应地修改其签名:

ID2D1HwndRenderTarget*& MapEditor::GetpRT()
//                    ^
{
    return pRT;
}

答案 1 :(得分:0)

这是一个非常奇怪的代码。您按值传递所有内容,并希望修改函数中的值。

如果您计划修改传递给函数的指针,原型应如下所示:

void CreateRenderTarget(HWND,ID2D1HwndRenderTarget *& pRT);