静态函数的意外行为

时间:2011-12-12 02:28:43

标签: c++ static

我正在研究一个DX11项目,我得到一个静态函数的奇怪行为。我对静态函数有点不了解,所以我可能在某个地方犯了错误。

我的功能很简单:

namespace Rendering
{
    static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX world)
    {

        D3DXMatrixTranslation(&world, obj->GetPosition()->x, obj->GetPosition()->y, obj->GetPosition()->z); 
        return true;
    }
}

并在循环中调用它来渲染所有对象:

for(unsigned int i = 0; i < listSize; i++)
    {

        if(entities[i].taken == false)
            continue; 
        entities[i].entry->Render(deviceContext, shader);

        PlaceObjectInMatrix(entities[i].entry, worldMatrix);

        if(entities[i].entry->GetIndexCount() != 0) 
        {
            shader->Render(deviceContext, entities[i].entry->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, entities[i].entry->GetTexture(), m_debugLight->GetDirection(), m_debugLight->GetDiffuseColor());
            objectsRendered++;
        }

        d3d->GetWorldMatrix(worldMatrix); //reset world matrix
    }

然而,它不起作用。然而,当我用函数调用替换函数调用时,它确实有效。这就像在函数调用中迷失了一些东西。

EntityBase类是抽象的,我实际渲染的类叫做EntityModelStatic,它是从EntityModel派生的。

2 个答案:

答案 0 :(得分:2)

static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX world)

world参数按值传递,因此函数获取自己的副本,并且调用者中的变量不会更改。这可能是你的问题。

使用指针(如D3DXMatrixTranslation)或引用,您的问题可能会消失。

答案 1 :(得分:2)

PlaceObjectInMatrix()函数在worldMatrix副本上运行。要更改原始矩阵,您必须声明如下函数:

static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX& world);

更常规的方法是使用指针,如下所示:

static bool PlaceObjectInMatrix(const EntityBase& obj, D3DXMATRIX* world);

这样任何读取调用代码的人如PlaceObjectInMatrix(* entities [i] .entry,&amp; worldMatrix)都会意识到,该函数将改变worldMatrix对象